我正在尝试在用户点击标签时更改标签的颜色。我可以设置等待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
。我做错了什么?
答案 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
强制进行绘画循环。