在运行时更改标签颜色

时间:2014-07-30 16:50:34

标签: c windows winapi user-interface

我正在尝试在用户点击标签时更改标签的颜色。我可以设置等待WM_CTLCOLORSTATIC消息的文本颜色并执行:

hdc = (HDC)wParam;
SetTextColor(hdc, RGB(150, 150, 150));

所以,我试图对WM_LBUTTONUP消息做同样的事情:

case WM_LBUTTONUP:
{
    hdc = GetDC(hLabel);
    SetTextColor(hdc, RGB(100, 100, 100));
    ReleaseDC(hLabel, hdc);
    return 0;
}

之前创建了标签:

hLabel = CreateWindowW(
    L"STATIC", L"Some text", WS_CHILD | WS_VISIBLE | SS_LEFT,
    10, 10, 100, 30, hwnd, (HMENU)2, NULL, NULL
);

这不会改变颜色,GetLastError会返回0。我做错了什么?

2 个答案:

答案 0 :(得分:3)

我会建议不同的方法。引入名为static BYTE的{​​{1}}变量并将其设置为零。然后将此变量设置为changeColor以响应1并使您的标签无效。像这样:

WM_RBUTTONUP

然后在LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static BYTE changeColor; // the rest of your code, like main switch and other variables... 处理程序中将其初始化为:

WM_CREATE

现在您需要像这样重写case WM_CREATE: { changeColor = 0; // the rest of your code, if you had any } return 0L;

WM_CTLCOLORSTATIC

关键是,在case WM_CTLCOLORSTATIC: { hdc = (HDC)wParam; SetTextColor(hdc, RGB( 150 - 50 * changeColor, 150 - 50 * changeColor, 150 - 50 * changeColor ) ); } return DefWindowProc(hWnd, msg, wParam, lParam); 中将changeColor设置为1并使标签无效后,WM_LBUTTONUP宏中的表达式将为RGB,即RGB( 100, 100, 100 )正是你想要的。您没有指定重置颜色的位置,但除了将WM_LBUTTONUP设置为零之外,您将执行与changeColor相同的操作。

现在唯一剩下的就是向您展示如何处理WM_LBUTTONUP(或WM_RBUTTONUP,我不知道您问题的那部分不清楚):

case WM_LBUTTONUP:
    {
         changeColor = 1;
         InvalidateRect( hLabel, NULL, TRUE );
         // the rest of your code goes here, if there is any
    }
    return 0L;

我的问题不足以让我进一步帮助你,所以我希望这会有所帮助。

如果您需要进一步的帮助,请发表评论。

祝你好运!

答案 1 :(得分:2)

绘制控件时必须设置文本颜色。换句话说,回应WM_CTLCOLORSTATIC

要更改颜色以响应按钮向上,请记下新颜色,并通过调用InvalidateRect强制进行绘画循环。