在 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_GROUPBOX
的 CButton
,但在这个函数中,它的 nCtlColor
是 CTLCOLOR_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 获取一个并获取其基本代码部分:派生自CStatic
、OnPaint()
和@ 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 控件中更改背景和标题的颜色的主要内容,如果未能解决你的问题,请参考以下文章