首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Win32 WM_CTLCOLORSTATIC背景未完全填充

Win32 WM_CTLCOLORSTATIC背景未完全填充
EN

Stack Overflow用户
提问于 2020-05-31 19:02:29
回答 1查看 113关注 0票数 3

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

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

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

代码语言:javascript
运行
复制
// 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;
}

似乎我需要以某种方式使整个客户端失效,但我不知道如何做到这一点。显然,我可以谨慎地使矩形在对话框设计器中精确的大小,但这似乎并不是最安全的方法。

EN

Stack Overflow用户

回答已采纳

发布于 2020-05-31 20:17:24

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

代码语言:javascript
运行
复制
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中的替换对象是用户创建的(但在本例中似乎并非如此),这可能会导致问题。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62121140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档