在 MFC 控件中更改背景和标题的颜色

Posted

技术标签:

【中文标题】在 MFC 控件中更改背景和标题的颜色【英文标题】:Change color of background and title in MFC Control 【发布时间】:2014-04-04 13:08:20 【问题描述】:

我想在 MFC 应用程序中更改我的 EDIT CONTROL、STATIC CONTROL 和 BUTTON CONTROL 的文本颜色和背景颜色。控件位于CDialogEx 对话中。

我尝试添加 OnCtlColor(在 Visual Studio 中使用向导,在 WM_CTLCOLR 消息上),但我无法设置可能静态控件和按钮控件的颜色。

我还在OnCtlColor 函数中(在 IF 构造中)设置了一个断点,但我什么也没收到。

我还尝试使用SetTextColor 函数从GetDlgItem 检索控件的句柄,但我无法随意更改颜色。

请帮帮我。

【问题讨论】:

请显示您尝试过的代码。 默认情况下,所有静态控件的 ID 为 IDC_STATIC。您要操作的任何静态控件都必须具有唯一 ID,而不是默认 ID。在资源编辑器中,将您想要更改的每个静态控件的 ID 更改为每个控件唯一的 ID。 【参考方案1】:

我可以断言我尝试在 OnCtlColor 中使用 CDialog 并且它适用于静态和编辑控件。

你所要做的就是:

要更改背景颜色,您需要创建一个仍然存在于该函数之外的画笔并返回其HBRUSH

return (HBRUSH) m_brush.GetSafeHandle();

所以你必须创建一个成员变量或静态变量(在此代码中为m_brush)(我推荐第一个),并且在对话框初始化中你必须创建你想要的画笔。

我认为也许某些控件不适用于此功能,对于那些我也使用过的控件

pDC->SetBkColor(RGB(0,0,255));

但似乎什么也没做;它在代码中是为了安全。

为了改变文字颜色,我做到了

pDC->SetTextColor(RGB(255,0,0));

这些体验对于编辑和静态效果很好,但对组合框完全不适用!

Groupboxes 在 MFC 中是一个奇怪的实体,有点像 platyplus:它们是带有 BS_GROUPBOXCButton,但在这个函数中,它的 nCtlColorCTLCOLOR_STATIC 而不是 CTLCOLOR_BTN!我为他们做了这个

UINT nStyle = (UINT)(pWnd->GetStyle() & 0x0F);

if(nStyle == BS_GROUPBOX)

    return (HBRUSH) m_brush2.GetSafeHandle();

绘制的是组框标题后面的小矩形!

我无法更改组框的文本颜色!

如果您有分组框并且更改其标题的文本颜色非常重要,您可以从http://www.codeproject.com/Articles/29016/XGroupBox-an-MFC-groupbox-control-to-display-text 获取一个并获取其基本代码部分:派生自CStaticOnPaint() 和@ 987654338@ 方法。不要忘记消息地图上的ON_WM_PAINT()。我不知道OnEraseBkgnd() 和它的ON_WM_ERASEBKGND() 消息映射是否如此重要。 还需要将它们更改为资源中的静态文本控件,声明一个XGroupBox 变量并对其进行DDX_Control。 我测试了它,它确实有效。

对于按钮,CButtons 不起作用。但是,对于每个按钮,我只是在类中声明了一个CMFCButton 变量并为每个按钮做了一个DDX_Control。之后,我有两个选择:

在表单构造函数中将其 m_bTransparent 属性设置为 TRUE(在 afxbutton.cpp 文件中搜索此变量以供参考),以获得与表单颜色相同的那些(我还绘制了表单;就我而言,我正在应用程序上实现主题)

在表单初始化中用SetFaceColor()设置背景颜色,用SetTextColor()设置文本颜色。

CMFCButton 没有设置这些东西时,它的颜色来自当前选择的CMFCVisualManager 的主题混合。

注意:我还将 CSpinButton 实体替换为 CMFCSpinButon 实体,因为我想要所选主题的颜色。

OnCtlColor 中,nCtlColor 变量很重要,因为它允许您将不同的颜色个性化为不同的类型,而无需为每个控件测试dynamic_cast 的成功或失败。

不要忘记将ON_WM_CTLCOLOR() 添加到您的消息映射中。

更新 1: 在遵循http://social.msdn.microsoft.com/Forums/vstudio/en-US/53f47162-078a-418f-8067-ee61a81ceeac/checkbox-transparent-color-not-working-in-vs2008?forum=vcgeneral 上接受的答案的建议后,我做了自己的 Groupbox 课程,现在是这样的:

class CMyGroupBox: public CButton

protected:
    virtual void PreSubclassWindow()
    
        SetWindowTheme(*this, _T(""), _T(""));
        #pragma comment(lib, "UxTheme.lib")
    
;

我刚刚声明了其中一个,并使用其各自的控件 ID 执行了 DDX_Control,现在我可以看到我提供给 SetTextColor 的颜色的文本。如果您为此控件返回 HBRUSH,则绘制的是围绕组框标题绘制的未填充矩形。

更新 2: 我只是将CMyGroupBox 概括为CMyButton,因为它的PreSubClassWindow 方法不仅用于组框,还用于复选框和按钮。在复选框中效果很好,在按钮中,我对结果不太满意。

更新 3: 我试图消除对文本呈现的一些奇怪影响,我只是评论了 pDC->SetBkColor(RGB(0,0,255)); 行;结果是文本后面有一个丑陋的矩形:(。然后我用pDC->SetBkMode(TRANSPARENT);替换它,我也看到了奇怪的效果:(

更新 4: 为了避免必须将我所有的复选框、组框和按钮声明为包含 PreSubClassWindow 方法的类,我研究并发现不需要这样做。代码

SetThemeAppProperties(0);
#pragma comment(lib, "UxTheme.lib")
AfxGetMainWnd()->SendMessage(WM_THEMECHANGED, 0U, 0L);

在整个应用程序级别禁用所有控件的主题化。

【讨论】:

以上是关于在 MFC 控件中更改背景和标题的颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何更改MFC按钮的背景色

如何在 mfc 中更改 CImage 对象的背景颜色?

MFC设置对话框背景色及控件颜色

MFC:更改 CEdit 的颜色

是否可以更改 CMFCEditBrowseCtrl 控件的背景颜色?

双击更改mfc中列表控件中行的颜色