回 帖 发 新 帖 刷新版面

主题:WM_CTLCOLORSTATIC 消息 怎么用?

请问WM_CTLCOLORSTATIC消息怎么用,这里的lParam和wParam 参数分别是什么? lParam参数是不是窗口控制项的代号,wParam参数又是什么 ?
WM_CTLCOLORSTATIC 消息 怎么用?
我有建立了3个静态控制项hwndLabel[0],hwndLabel[1],hwndLabel[3],我想更改这三个标签的文字分别的红,绿,蓝 和背景色。 以下是我的代码片断:
    static HWND hwndLabel[3];
    HINSTANCE hInstance;
    HBRUSH hBrushStatic;
     switch(message)
    {
           case WM_CREATE:
    hInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
    
    //下面是建立三个标签控制项,代号0,1,2
    for(i=0;i<3;i++)
    {
        hwndLabel[i] = CreateWindow(
        TEXT("static"),
        szColorLabel[i],
        WS_CHILD | WS_VISIBLE | SS_CENTER,
        0,0,0,0,
        hwnd,
        (HMENU)i,
        hInstance,
        NULL);
    }
        .......
    hBrushStatic = CreateSolidBrush(
     GetSysColor(COLOR_BTNHIGHLIGHT));
    return 0;
    
    ........
        
    case WM_CTLCOLORSTATIC:
    i= GetWindowLong((HWND)lParam,GWL_ID); //获取窗口控制项ID        
    //根据所获取的id依次更改文字颜色        
    switch(i)
    {
    case 0:
    SetTextColor((HDC)wParam,RGB(255,0,0));
    break;
    case 1:
    SetTextColor((HDC)wParam,RGB(0,255,0));
    break;
    case 2:            
    SetTextColor((HDC)wParam,RGB(0,0,255));
    }
    SetBkColor((HDC)wParam,GetSysColor(COLOR_BTNHIGHLIGHT));
    return (LRESULT)hBrushStatic;

    ....
    }
    上述代码的运行时各标签的文字颜色并没有更改,而只更了背景色。不知道错在哪里了?
    

回复列表 (共3个回复)

沙发

(1)WM_CTLCOLORSTATIC是当静态控件重画时,控件给父窗口发送的消息,在处理该消息时应该返回一个画刷,系统用这个画刷重绘控件的背景颜色。
wParam是该控件的DC句柄,lParam是控件的句柄
(2)用SetBkColor函数设置的是文字背景颜色,不是控件背景。
你的代码是不是没有加进让控件无效InvalidateRect函数,导致的颜色没有改变。
下面的代码用鼠标在窗口单击可以改变标签颜色,仅供参考:

#include<windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR szCmdLine, int nCmdShow)
{
    HWND     hwnd;
    MSG      msg;
    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   = WndProc;
    wndclass.lpszClassName = "sample";
    wndclass.lpszMenuName  = NULL;
    wndclass.style         = CS_HREDRAW|CS_VREDRAW;

    if(!RegisterClass(&wndclass))
    {
        MessageBox(NULL,"Register class fail!","Warning",MB_ICONERROR);
        return FALSE;
    }

    hwnd=CreateWindow("sample", "Change lable text color sample",
                      WS_OVERLAPPEDWINDOW,
                      CW_USEDEFAULT, CW_USEDEFAULT, 400, 200,
                      NULL, NULL, hInstance, NULL);

    ShowWindow (hwnd, nCmdShow);
    UpdateWindow (hwnd);

    while(GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hStatic[3];
    static int i;
    TCHAR  strLabel[8];

    switch(uMsg)
    {
    case WM_CREATE:
        for (i = 0; i < 3; i++)
        {    
            wsprintf (strLabel, "Label%d", i + 1);
            hStatic[i] = CreateWindow ("static", strLabel, 
                                       WS_CHILD | WS_VISIBLE | SS_CENTER,
                                       (i+1) * 80, 50, 50,50,
                                       hwnd,(HMENU)i,
                                       ((LPCREATESTRUCT)lParam)->hInstance,
                                       NULL);
        }                                       
        break;

    case WM_LBUTTONDOWN:
        i = i % 3;    //让i在0~2间循环

        //让这个控件无效,该控件进行重绘,才给主窗口发送WM_CTLCOLORSTATIC消息        
        InvalidateRect (hStatic[i], NULL, TRUE);
        break;

    case WM_CTLCOLORSTATIC:
        switch (i)
        {
        case 0:
            SetTextColor ((HDC)wParam, RGB(255,0,0));
            i++;
            break;
        case 1:
            SetTextColor ((HDC)wParam, RGB(0, 255, 0));
            i++;
            break;
        case 2:
            SetTextColor ((HDC)wParam, RGB (0,0,255));
            i++;
            break;
        }

        SetBkColor ((HDC)wParam, GetSysColor(COLOR_BTNFACE));
        return (LONG)CreateSolidBrush(GetSysColor(COLOR_BTNFACE));

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hwnd,uMsg,wParam,lParam);
}

板凳


请看在Visual Fotran 中如何改变静态文字和背景颜色:
  case(WM_CTLCOLORSTATIC,WM_CTLCOLORDLG)  !设置对话框的背景色
    hDC = wParam
    i = SetBkColor(hDC,RGB(#a6,#ca,#f0))       ParaDialogProc1=ghBkBrush
    RETURN
返回的化刷色ghBkBrush在WM_CREATE中定义

3 楼

寻找一直寻找机会的人!
一个趋势中的趋势的项目!
一个直销和传销终结者的项目!
一个帮助普通创业者成功的项目!
   我们在互联网上正在拓展一个生意项目,现在正在寻求合作伙伴。我们认为成功的关键是你是什么人?还有你和谁在一起。我们在乎的是--您是否是有激情、有梦想的人。有意者请跟我们联系,我们和您谈谈,给您讲解一些生意概念,或许我们可以合作。一个集即时网游、交友,娱乐游戏,网络品牌代理商城,互联网平台项目招商进行中……详情QQ空间资料
网商咨询 摩客天宇QQ 909065437 

我来回复

您尚未登录,请登录后再回复。点此登录或注册