【问题标题】:Why SetTextColor changes also the background of the entire StaticEdtBox为什么 SetTextColor 也会改变整个 StaticEdtBox 的背景
【发布时间】:2015-10-27 23:39:01
【问题描述】:

每当我收到WM_CTLCOLORSTATIC 时,我都会尝试更改文本颜色。

 LRESULT ProcessWindowMessage(_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam)
        {
            switch (uMsg)
            {
            case WM_CTLCOLORSTATIC:
                ::SetTextColor((HDC)wParam, RGB(m_color.red, m_color.green, m_color.blue));
                ::SetBkMode((HDC)wParam, TRANSPARENT);
                return (LRESULT)GetStockObject(DKGRAY_BRUSH);
            }
            
            return m_orgWndProc(hWnd, uMsg, wParam, lParam);
        }

如您所见,“Just a test”的颜色发生了变化,但随之而来的是整个框的背景也发生了变化。

我已尝试返回几乎所有 GetStockObject() 组合,包括

return (LRESULT)GetStockObject(COLOR_BACKGROUND + number)

&

GetCurrentObject((HDC)wparam,OBJ_BRUSH)

我不得不说,这些命令以某种方式操纵了背景的颜色,但从未与过去的默认灰度值匹配。

我在这里错过了什么?

【问题讨论】:

  • 你真的应该发布SSCCE...
  • GetStockObject(COLOR_BACKGROUND + number) 不正确。你会想要使用GetSysColorBrush()。但是有一个更好的方法来获得默认行为:just call DefWindowProc() 并在执行 DC 操作后返回它返回的内容。

标签: c++ winapi gdi+ win32gui


【解决方案1】:

你没有尝试

return (LRESULT)GetStockObject(NULL_BRUSH);

正如 Mark Ransom 评论的那样,如果您设置新文本,则不会删除背景。

你应该使用:

return (LRESULT)GetSysColorBrush(CTLCOLOR_DLG);

如前所述。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-11-01
  • 2012-06-20
  • 1970-01-01
  • 2022-09-29
  • 2014-07-12
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多