更改win32的单选按钮文本颜色

时间:2015-08-06 11:00:18

标签: c++ winapi gdi

换色后,我会听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;
        }
    }

这适用于常规静态文本:标签等,但对常规单选按钮没有影响。

在我的调试尝试期间,我试着听过:

  1. WM_DRAWITEM - 未收到任何活动
  2. WM_CTLCOLORBTN - 仅接收常规按钮的事件(确定/取消)
  3. WM_CTLCOLOREDIT - 不接收任何活动。
  4. 我正在继承到另一个不是由我创建/创建的窗口,而是由我的进程构建。

2 个答案:

答案 0 :(得分:1)

@igal k说SetWindowTheme不起作用。由于评论对于示例代码是不够的。我发布它作为答案。

首先是结果。

enter image description here

代码:

as? String

答案 1 :(得分:0)

如果您有兴趣绘制完整的单选按钮,您需要做的是为单选按钮设置自定义窗口过程。在该过程中,您将获得WM_PAINT和WM_ERASEBKGND消息。 在擦除背景中,您只需填充控件的背景颜色。

在WM_PAINT中,您可以绘制控件,获取控件的窗口文本,并使用SetTextColor执行DrawText,将颜色设置为您需要的任何颜色

绘制无线电图像(圆圈和内部点)。您可以获取控件的所有状态变量并根据它绘制,就像它是否选中一样。每当你需要重新绘制时,即设置了新文本,只需调用invalidateRect强制重新绘制..