65.9K
CodeProject 正在变化。 阅读更多。
Home

颜色控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.27/5 (8投票s)

2001年11月4日

2分钟阅读

viewsIcon

102800

downloadIcon

3377

为 MFC 控件添加颜色

引言

Chris Maunder 撰写的关于子类化的精彩文章激励我添加代码。更改常用控件的颜色通常很棘手,因为根据控件的不同,可能需要重写不同的函数。例如,要为 CButton 着色,您必须实现

virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS)

而对于 CEdit,您必须实现

virtual BOOL OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, 
                           LRESULT* pLResult)

对于 CStatic...

afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor)

我经常发现自己在对话框类中重写 OnCtlColor 方法,然后使用 case 语句在各种控件之间切换。对于只有少量控件的应用程序,这种方法快速且简单。但是,当控件数量增加时,添加和删除颜色控件会变得繁琐且容易出错。它还将过多的逻辑放置在对话框类中。当前的类集为活动和禁用状态提供基本的着色,并添加颜色鼠标悬停效果(感谢 Chris!)。

接口

CColorButton, CColorEdit, CColorComboBox, CColorStatic 分别从 CButton, CEdit, CComboBox, CStatic 派生。它们还继承自 CColorControl,后者为设置颜色提供相同的接口。

// FG is foreground color or text color
// BG is background color of control
// Hot refers to the on mouse over colors
//
void SetColors(const COLORREF FGColor,const COLORREF BGColor, 
               const COLORREF HotFGColor, const COLORREF HotBGColor);
void SetDisabledColors(const COLORREF DisabledFGColor, 
                       const COLORREF DisabledBGColor);

//
//
void SetBgColor(COLORREF cr);
void SetFgColor(COLORREF cr);
void SetHotBgColor(COLORREF cr);
void SetHotFgColor(COLORREF cr);
void SetDisabledFgColor(COLORREF cr);
void SetDisabledBgColor(COLORREF cr);

//
// Time is in milliseconds and dictates the delay after the mouse
// leaves the rect of the control. The default is 10 milliseconds.
//
void SetRolloverDelay(UINT mSeconds );

用法

在将控件放入对话框编辑器后。

只需在类向导中声明成员变量。确保包含控件子类并重新生成,否则新的类可能不会出现在变量类型组合框中。

现在,在主对话框的 OnInitDialog 函数或 CWndOnCreate 函数中,设置控件所需的颜色。

m_btnColor.SetColors(RGB_GREEN, RGB_BLACK, RGB_WHITE, RGB_RED);
m_btnDisabled.SetDisabledColors(RGB_WHITE, RGB_BLACK);
m_btnDisabled.SetColors(RGB_RED, RGB_BLACK, RGB_RED, RGB_WHITE);
m_edtColor.SetColors(RGB_GREEN, RGB_BLUE, RGB_WHITE, RGB_RED);
m_cbColor.SetColors(RGB_BLUE, RGB_GREEN, RGB_WHITE, RGB_RED);
m_stcColor.SetColors(RGB_GREEN, RGB_BLUE, RGB_WHITE, RGB_RED);

结论

就是这样。这些类集应该为您提供一种简单的方法来为您的控件添加颜色,而无需实现任何绘图或消息回调函数。如果您只需要颜色控件而不需要鼠标悬停效果,可以将 HotFGColor 设置为与 FGColor 相同,并将 HotBGColor 设置为与 BGColor 相同。

历史

2002 年 3 月 15 日 - 更新下载。

© . All rights reserved.