win32的Static控件颜色文字颜色文字背景颜色的设置

6769 人浏览 | 时间: 2016-02-15 22:59:19 | 作者: codexia 会员文章,禁止转载

    Windows提供了一个消息,叫做WM_CTLCOLORSTATIC。这个消息看上去很长,我们拆分看,即WM_、CTL、COLOR、STATIC,分别表示窗口消息、CTL(Control控件)、颜色、静态的。合起来一看,就是静态控件颜色消息。这个消息给我们提供了修改static静态控件的文字颜色、文字背景颜色以及static静态控件的表面颜色。
    在文章《WM_CTLCOLORBTN消息就是一个摆设》中,我们知道,WM_CTLCOLORBTN消息实际上就成了摆设,这是设计失误。然而,这个并不影响其他控件的颜色修改。在学习了控件颜色修改消息WM_CTLCOLORBTN之后,我隐隐的担心其他控件消息是不是也没有用,然而我多虑了。可能下压按钮控件的特殊性吧。
    不过,与下压按钮控件修改颜色的原理是一样的,在WM_CTLCOLORSTATIC消息中,修改文字颜色、文字背景颜色以及返回一个画刷即可。
    我们先创建一个static静态控件,即在CreateWindow函数中使用"static"窗口类来创建窗口,其他参数和普通窗口差不多。不过记得加上窗口风格WS_CHILD和WS_VISIBLE,这样创建完毕后,在窗口上就可以看到static静态控件了。
    我们还要创建一个画刷,用于修改static静态控件表面的颜色的,也就是static静态控件这个子窗口的窗口背景颜色。控件就是一个窗口。不过要记得,要删除我们自己创建的画刷。我们这里就在窗口创建时(WM_CREATE消息)创建画刷和Static静态控件,在窗口销毁时(WM_DESTROY消息)删除我们自己创建的画刷。
    而我们要修改static静态控件的文字颜色、文字背景颜色和static静态控件颜色,就看WM_CTLCOLORSTATIC消息了。
    WM_CTLCOLORSTATIC消息的WPARAM参数是Static静态控件传过来的已经创建好的设备上下文的句柄,即HDC类型的值。我们做一个强制转换,然后就可以拿来用了。然后调用SetTextColor函数来修改文字的颜色,调用SetBkColor函数来修改文字背景颜色。然后将我们事先创建好的画刷句柄在这个消息中返回即可。
    这个流程你看了,照做了,确实能够实现效果。然而,知其然不知其所以然呀!看完前面,你做出来了。你会做了。你能表明你熟了。然而不是高手,更不是大神。后面才是精彩的分析部分。
    考虑到篇幅和接受情况,新手第一次接触,可能不太熟悉。所以本文就告诉你怎么实现这个效果,并给出完整代码,让你清楚实现代码和过程。有了这个基础,再看原理分析,就容易理解了。

【Static标签颜色文字颜色文字背景颜色的设置效果图】
    下面是完整的代码:
#include "windows.h"
#include <tchar.h>
TCHAR tip[]=_T("C++技术网http://www.cjjjs.com");
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    static HBRUSH hBrush;
    switch (message)
    {
        case WM_CREATE:
            {
                //创建静态控件
                CreateWindow(_T("static"),_T("C++技术网http://www.cjjjs.com"),WS_CHILD|WS_VISIBLE,0,0,300,100,hwnd,(HMENU)1,(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),0);
                hBrush = CreateSolidBrush(RGB(200,10,210));//创建一个画刷
                return 0;
            }
        case WM_CTLCOLORSTATIC:
            {
                HDC hdc = (HDC)wParam;//将传过来的参数转成正确的类型,供后面使用
                SetTextColor(hdc,RGB(255,255,100));//设置文字颜色
                SetBkColor(hdc,RGB(100,50,150));//设置文字背景颜色
                return (LRESULT)hBrush;//返回画刷,用于修改static控件颜色
            }
        case WM_DESTROY:
            DeleteObject(hBrush);//记得删除创建的画刷,养成好习惯
            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;
}
当前文章为会员文章,请前往[用户中心]开通会员后继续阅读。

相关阅读