Windows零基础入门:2.26 窗口阴影效果CS_DROPSHADOW解密

8785 人浏览 | 时间: 2015-09-23 15:28:45 | 作者: codexia 会员文章,禁止转载

    终于快将窗口类风格讲完了,很是兴奋哦。对于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);
}
当前文章为会员文章,请前往[用户中心]开通会员后继续阅读。

Win32课程菜单