Windows API学习-修改控件背景文字颜色(1)


当 static 控件或具有 ES_READONLY 风格的 edit 控件被绘制时,会向父窗口发送 WM_CTLCOLORSTATIC 消息。如果我们在窗口过程中处理该消息,就必须返回一个画刷句柄,Windows 会使用该画刷来绘制控件背景(子窗口背景)。

也就是说,改变 static 控件的背景颜色只有这一种方式,就是处理 WM_CTLCOLORSTATIC 消息。WM_CTLCOLORSTATIC 消息就是用来设置背景画刷的。

改变 static 控件的背景颜色:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
    PAINTSTRUCT ps;
    HDC hdcWnd;
    static HFONT hFont;  //逻辑字体
    static HWND hStatic;  //静态文本框控件
    static HBRUSH hBrush;  //画刷
    switch (message){
        case  WM_CREATE:
            //创建画刷
            hBrush = CreateSolidBrush( RGB(0x41, 0x96, 0x4F) );  //翠绿色
            //创建逻辑字体
            hFont = CreateFont(-14/*高*/, -7/*宽*/, 0, 0, 400 /*400表示正常字体*/,
                FALSE/*斜体?*/, FALSE/*下划线?*/, FALSE/*删除线?*/,DEFAULT_CHARSET,
                OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY,
                FF_DONTCARE, TEXT("微软雅黑")
            );
            //创建静态文本框控件
            hStatic = CreateWindow(TEXT("static"), TEXT("欢迎来到泛容!"),
                WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE | SS_CENTER,
                20 /*x坐标*/, 20 /*y坐标*/, 240 /*宽度*/, 60 /*高度*/,
                hWnd /*父窗口句柄*/, (HMENU)1 /*控件ID*/, hInst /*当前程序实例句柄*/, NULL
            );
            //设置控件的字体
            SendMessage(hStatic, WM_SETFONT, (WPARAM)hFont, NULL);
            break;
        case WM_CTLCOLORSTATIC:
            return (INT_PTR)hBrush;  //这里必须返回画刷句柄
        case WM_PAINT:
            hdcWnd = BeginPaint(hWnd, &ps);
            // TODO:  在此添加任意绘图代码...
            EndPaint(hWnd, &ps);
            break;
        case WM_DESTROY:
            DeleteObject(hBrush);
            DeleteObject(hFont);
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

运行结果:
1.png