【发布时间】:2015-10-29 11:58:04
【问题描述】:
当颜色改变时,我会听 WM_CTLCOLORSTATIC 并采取相应的行动:
LRESULT ProcessWindowMessage(_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam)
{
switch (uMsg)
{
case WM_CTLCOLORSTATIC:
LRESULT lBrush = ::DefWindowProc(hWnd, uMsg, wParam, lParam); // get default brush used so far
::SetBkMode((HDC)wParam, TRANSPARENT);
::SetTextColor((HDC)wParam, RGB(m_color.red, m_color.green, m_color.blue));
return lBrush;
}
}
这适用于常规静态文本:标签等,但对常规单选按钮没有影响。
在调试过程中,我尝试过听:
- WM_DRAWITEM - 不接收任何事件
- WM_CTLCOLORBTN - 仅接收常规按钮的事件(OK / CANCEL)
- WM_CTLCOLOREDIT - 不接收任何事件。
我将子类化到另一个不是由我生成/创建,而是由我的进程构建的窗口。
【问题讨论】:
-
当主题处于活动状态时,您无法控制这些颜色。
-
按钮控件支持
NM_CUSTOMDRAW,或许可以这样改变文字颜色(我没试过)。 -
你为什么不处理 WM_PAINT 和 WM_ERASEBKGND 并自己画出来
-
@Tony 是的。这是唯一的方法。
-
说真的,覆盖主题并不“难”。使用
DrawThemeBackground绘制单选按钮形状,使用DrawText绘制文本。不是火箭科学。