Windows零基础入门:2.26 窗口阴影效果CS_DROPSHADOW解密
终于快将窗口类风格讲完了,很是兴奋哦。对于CS_GLOBALCLASS风格,在窗口类中重点讲过了,这类就不在重复了。而今天讲的这个窗口类是最后一个,实现的效果也是非常的棒哦。这个在网上资料几乎没有哦。
这个窗口类风格就是CS_DROPSHADOW,MSDN解释说,这个风格可以让窗口产生阴影效果。阴影效果就是窗口边缘处的渐变阴影。要想有阴影效果,我们要先使用SPI_SETDROPSHADOW标志来启动阴影或者关闭阴影。调用的函数如下:
SystemParametersInfo(SPI_SETDROPSHADOW,0, (PVOID)TRUE, 0); // - 开启阴影效果
SystemParametersInfo(SPI_SETDROPSHADOW,0, (PVOID)FALSE, 0);// - 关闭阴影效果
这种效果主要用来凸显增强窗口的层次关系,在最上层的产生厚重的阴影,而不仅仅是窗口标题栏颜色变深。要想窗口有这种阴影效果,创建窗口的窗口类含有这个窗口类风格。窗口不能是子窗口。
我们先来看看效果图。
正常的无阴影的效果如下:
有阴影效果的窗口效果如下:
阴影窗口获得焦点和失去焦点时,效果图如下:
#include <Windows.h>
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);// - 窗口过程函数的声明
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, PSTR szCmdLine, int iCmdShow)
{
WNDCLASS wndclass;
// - 给创建的窗口类指定各种特性值
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DROPSHADOW;// - 窗口基本风格特性
wndclass.lpfnWndProc = WinProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = L"MyClass";
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, L"注册窗口类失败,此程序需要运行在Windows NT平台下。", L"注册窗口类提示", MB_ICONERROR);
return 0;
}
SystemParametersInfo(SPI_SETDROPSHADOW,0, (PVOID)TRUE, 0);
HWND hwnd = CreateWindow(L"MyClass", L"有阴影窗口_C++技术网", WS_OVERLAPPEDWINDOW , 100, 100, 600, 600, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
SystemParametersInfo(SPI_SETDROPSHADOW, 0, (PVOID)FALSE, 0);
MSG msg;
// - 消息循环
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
HDC hdc;
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// - 放在此处,作为函数内的局部变量,函数结束后,自动释放此句柄
PAINTSTRUCT ps;
RECT rect,TRect;
TRect.left = 0;
TRect.top = 0;
TRect.right = 400;
TRect.bottom = 400;
TCHAR Tip[256] = {L"C++技术网提示:这是有阴影窗口。"};
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetWindowRect(hwnd, &rect);
DrawText(hdc, Tip, -1, &TRect, DT_SINGLELINE);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
当前文章为会员文章,请前往[用户中心]开通会员后继续阅读。