本节我们继续学习UpdateLayeredWindow这个API, 通过它我们来实现一个阴影效果的窗体(像Window7窗体效果).
思路: 1. 创建二个层窗体, 一个作为控件窗件,另一个做阴影效果窗体;
2. 在第一个窗体实现各种控件创建以及相关逻辑处理,此窗体设为全透明;
3. 将第二个窗体重叠并保持重叠第一个窗体(即大小,位置,移动或改变大小都保持一致),此窗体选入一张边沿带有阴影效果通道图(BMP, PNG)通过UpdateLayeredWindow函数年
来实现效果;
4. 截取第一个窗体中控件的图并与第二个窗体叠加,因为UpdateLayeredWindow之后的窗体有穿透能力这样更好触及到被完成透明的第一个窗体上;
声明: 此方法源于Codeproject上一个中国程序员的文章
一. 代码演示
1. 在主窗体WM_NCCREATE中调用_ShadowWnd函数, 通过此函数修改主窗体的两个属性 -- 1. 替换窗体过程函数(用于截获主窗体的消息); 2. 修改主窗体为层窗体
LRESULT CALLBACK _DefWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
static const UINT IDC_BTNEXIT = 1002;
switch (nMsg)
{
case WM_NCCREATE:
{
_ShadowWnd(hWnd);
break;
}
...
}
return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
}
{
static const UINT IDC_BTNEXIT = 1002;
switch (nMsg)
{
case WM_NCCREATE:
{
_ShadowWnd(hWnd);
break;
}
...
}
return ::DefWindowProc(hWnd, nMsg, wParam, lParam);
}