win32使用SetClassLong修改窗口背景颜色

7480 人浏览 | 时间: 2016-02-04 21:03:10 | 作者: codexia 会员文章,禁止转载

    在窗口创建完毕之后,如果想修改窗口的背景颜色,我们可以使用SetClassLong函数来实现。
    窗口类结构体的窗口背景画刷成员是用来确定背景颜色和背景图片的。默认的窗口背景颜色为白色。因为背景画刷句柄赋值了一个白色画刷。如果想要修改窗口背景颜色或者图片,只要修改窗口类中的背景画刷改变,窗口背景就改变了。
    而窗口背景画刷是在窗口类中定义的,所以我们修改窗口背景的话,也就是修改窗口类中的背景画刷成员。我们使用SetClassLong函数可以修改窗口类的信息。将标志GCL_HBRBACKGROUND传入SetClassLong函数,传入窗口背景画刷句柄,就可以修改窗口背景了。
    如果只是修改,并不能立即生效。因为即使是修改了窗口背景画刷,窗口也没有重绘,所以不会使用新的窗口画刷来绘制窗口背景。
    下面是完整的代码:

#include "windows.h"
#include <tchar.h>
TCHAR txt[]=_T("C++技术网:修改窗口背景颜色");
// - 项目是Unicode字符集
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    switch (message)
    {
        case WM_PAINT:
            {
                hdc = BeginPaint(hwnd,&ps);
                TextOut(hdc,0,0,txt,lstrlen(txt));
                EndPaint(hwnd,&ps);
            }
            return 0;
        case WM_LBUTTONDOWN:
            SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(DKGRAY_BRUSH));
            InvalidateRect(hwnd,NULL,TRUE);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
        break;//跳出到默认处理
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
    TCHAR ClassName[] = _T("MyClass");
    TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
    WNDCLASS wndClass;
    wndClass.cbClsExtra=0;
    wndClass.cbWndExtra=0;
    wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndClass.hInstance = hInstance;
    wndClass.lpfnWndProc = WinProc;
    wndClass.lpszClassName = ClassName;
    wndClass.lpszMenuName=NULL;
    wndClass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;

    if(!RegisterClass(&wndClass))return 0;
    HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,10,100,600,400,NULL,NULL,hInstance,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);

    MSG msg;
    while (GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
当前文章为会员文章,请前往[用户中心]开通会员后继续阅读。

相关阅读