经多方尝试,在使用c++开发windows应用程序中(不使用mfc,单纯用win32 api),想要改变按钮的背景色是一个很蛋疼的问题。
查询了msdn,找到如下说明:
在绘制按钮之前,会将 WM _ CTLCOLORBTN 消息发送到按钮的父窗口。 父窗口可以更改按钮的文本和背景色。 但是,仅所有者描述的按钮会响应处理此消息的父窗口。
仅所有者描述的按钮就是自绘按钮,如果不是自绘按钮则这个消息没啥用。但我创建自绘按钮了还需要用这个消息么??自己写代码绘制就行了。
网上查到的背景色修改代码:
case WM_CTLCOLORBTN:
if((HWND)lParam==hwndBtn&&wParam==1)
{
HWND hbn = (HWND)lParam;
HDC hdc = (HDC)wParam;
RECT rc;
TCHAR text[64];
GetWindowText(hbn, text, 63);
GetClientRect(hbn, &rc);
SetTextColor(hdc, RGB(0, 0, 0));
SetBkMode(hdc, TRANSPARENT);
DrawText(hdc, text, _tcslen(text), &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
return (INT_PTR)CreateSolidBrush(RGB(0, 0, 255));
}
break;
其原理就是带BS_OWNERDRAW样式的按钮绘制前会向父窗口发送WM _ CTLCOLORBTN消息,在响应此消息时将自定义的画刷当做返回值返回应用程序,也即是其父窗口,父窗口会使用此画刷来绘制按钮背景,很不好用。
建议使用自绘按钮来实现相关功能。