Win32 WM_CTLCOLORSTATIC 背景未完全填充

Posted

技术标签:

【中文标题】Win32 WM_CTLCOLORSTATIC 背景未完全填充【英文标题】:Win32 WM_CTLCOLORSTATIC background not completely filled 【发布时间】:2020-05-31 19:02:29 【问题描述】:

我正在处理一个由主机程序创建和控制的对话框。主机创建窗口,然后将所有消息发送给我,但这意味着我无法完全访问它所做的一切。 (我提到这一点是因为它可能会导致我的问题。)

我想将LTEXT 的颜色更改为红色。我正在处理WM_CTLCOLORSTATIC 消息,它在绘制文本的地方工作。我遇到的问题是LTEXT 的矩形比文本的长度略宽。对于不包含文本的控件部分,它会将背景保留为白色,而不是我指定的 COLOR_BTNFACE

这是我的处理程序的代码。我叫它HANDLE_WM_CTLCOLORSTATIC

// color message handler
HBRUSH OnControlColor ( HWND hDlg, twobyte dlgItem, HDC hdcCtrl, int type ) override

    if ( (dlgItem == ID_MANUAL_EDIT_WARNING) && (type == CTLCOLOR_STATIC) )
    
        SetTextColor(hdcCtrl, RGB(204, 0, 0));
        SetBkColor(hdcCtrl, GetSysColor(COLOR_BTNFACE));
        return (HBRUSH)GetSysColorBrush(COLOR_BTNFACE);
    
    return NO;

似乎我可能需要以某种方式使整个客户端 rect 无效,但我不确定如何执行此操作。显然,我可以在对话框设计器中小心地将矩形设置为正确的大小,但这似乎不是最安全的方法。

【问题讨论】:

圣烟。那解决了它。如果你想把它写成一个解决方案,我会标记它。 “主机创建窗口,然后将所有消息发送给我” - 所以在系统和您的窗口之间有一个中间人,它会尝试模仿系统? 是的,这是一种创建跨平台对话框的本土方法,允许第三方扩展主机的功能。另外我很确定这一切都发生在主机进程中。 【参考方案1】:

你可以做的是明确选择你想要的背景画笔到控件的设备上下文中;因此,当绘制它的矩形时,将使用该画笔。您可以在处理程序中添加一行代码:

HBRUSH OnControlColor ( HWND hDlg, twobyte dlgItem, HDC hdcCtrl, int type ) override

    if ( (dlgItem == ID_MANUAL_EDIT_WARNING) && (type == CTLCOLOR_STATIC) )
    
        SetTextColor(hdcCtrl, RGB(204, 0, 0));
        SetBkColor(hdcCtrl, GetSysColor(COLOR_BTNFACE));
        SelectObject(hdcCtrl, GetSysColorBrush(COLOR_BTNFACE)); // Select the B/G brush
        return (HBRUSH)GetSysColorBrush(COLOR_BTNFACE);
    
    return NO;

我在这里担心的一个问题是,您正在由另一个进程“拥有”的设备上下文中操作对象选择;如果该 DC 中的替换对象是用户创建的,这可能会导致问题(但在这种情况下似乎并非如此)。

【讨论】:

以上是关于Win32 WM_CTLCOLORSTATIC 背景未完全填充的主要内容,如果未能解决你的问题,请参考以下文章

如何修改汇编win32中 static控件的字体颜色

Java 面试都只是背答案吗?

Java 面试都只是背答案吗?

个人作业-Week2

什么叫win32?

win32 是啥病毒?