windows - Win32 WM_CTLCOLORSTATIC 背景未完全填充

标签 windows winapi

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

我想将 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 无效,但我不确定该怎么做。显然,我可以在对话框设计器中仔细地使矩形的大小完全正确,但这似乎不是最安全的方法。

最佳答案

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

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 中的替换对象是用户创建的,这可能会导致问题(但在这种情况下似乎并非如此)。

关于windows - Win32 WM_CTLCOLORSTATIC 背景未完全填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62121140/

相关文章:

python - Windows 不生成 Python 编译文件

c++ - 在我的代码运行完成之前,如何防止事件被传送到 GUI?

c - NtFsControlFile 在压缩时似乎无法处理 < 728 字节的文件

c# - 记录所有在 Windows 中关闭的 Windows

windows - 如何创建带有不透明子控件(或子窗口)的透明窗口?

c++ - 如何安全地关闭其中有无限循环的线程

arrays - 如何使用变量作为索引计算 FOR 循环中的数组?

c# - 如何没有/一个窗口标题并为任务栏设置不同的标题?

python - Windows 工作日志

c# - 终止在 C# 中运行消息循环的工作线程