带任意字体的彩色/闪烁控件和对话框






4.91/5 (17投票s)
改变任何标准控件颜色、字体或设置闪烁模式的最简单方法
引言
在这篇文章中,我想介绍两个模板类,它们可以帮助您进行简单的对话框开发。我们经常尝试为对话框中的静态文本框、编辑框或其他控件设置不同的颜色或字体。为了简化这项工作,我编写了两个类:CColorCtrl
和 CFontCtrl
。这些类有两个优点。首先,您无需放弃您喜欢的类。因为这些类是模板,所以它们可以附加到任何现有的 CWnd
类上。其次,这些类没有任何绘制操作。
CColorCtrl v1.3
控件有两种工作模式
- 简单彩色模式
- 闪烁模式
您可以自定义
- 文本颜色(s)
- 背景颜色(s)
- 闪烁延迟
如果您的控件使用 WM_CTLCOLOR
消息进行绘制(几乎所有标准窗口控件都这样做),您就可以使用这个模板。您也可以将其用于整个对话框(请参阅系统菜单中的“关于”对话框)。
用法
- 将 ColorCtrl.h 包含到您的项目中。
- 使用对话框编辑器创建一个控件。
- 使用类向导为此控件添加成员变量。
- 将
CCtrlClass m_ctrl
替换为CColorCtrl<CCtrlClass> m_ctrl
例如,替换CEdit m_edit; CStatic m_static;
用
CColorCtrl<CEdit> m_edit; CColorCtrl<CStatic> m_static;
使用以下函数更改颜色
void SetTextColor(COLORREF); COLORREF GetTextColor(); void SetTextBlinkColors(COLORREF, COLORREF); void SetBkColor(COLORREF); COLORREF GetBkColor(); void SetBkBlinkColors(COLORREF, COLORREF);
要设置默认颜色,请使用 CLR_DEFAULT
作为参数。要设置系统颜色,请使用宏 CC_SYSCOLOR(index)
,其中“index
”是系统颜色 ID 之一(请参阅 ::GetSysColor
的帮助)。此宏不会调用 ::GetSysColor
,而是为后续使用装饰索引。
使用以下函数更改背景图案
void SetBkPattern(UINT nResID); void SetBkPattern(HBITMAP); void SetBkBlinkPattern(UINT nResID1, UINT nResID2); void SetBkBlinkPattern(HBITMAP, HBITMAP);
要移除图案,请使用 NULL
作为参数。
HBITMAP
参数不应附加到任何 CBitmap
类(使用 CBitmap::Detach()
进行分离)。不要为发送到这些函数的任何 HBITMAP
调用 DeleteObject()
。对于 Windows 9x,位图的大小限制为 8*8 像素。
使用以下函数开始/停止闪烁
void StartBlink(int iWho, UINT nDelay); void StopBlink(int iWho); UINT GetDelay();
参数可以是以下值之一
CC_BLINK_TEXT
CC_BLINK_BK
CC_BLINK_BOTH
参数 nDelay 可以是以下值之一
CC_BLINK_NOCHANGE
- 不改变闪烁速度CC_BLINK_FAST
CC_BLINK_NORMAL
- 默认CC_BLINK_SLOW
- 任何其他以毫秒为单位指定的值
如果要仅使用纯色,请调用 UseSolidColors(TRUE)
。如果您在使用低颜色分辨率的文本背景透明度时遇到问题,请调用 ForceOpaque()
,但请注意:如果您使用图案或非纯色,文本下方会有一个与背景不同的矩形。
有两个派生类 CColorCtrlEx
和 CBlinkCtrlEx
,它们允许您在模板级别预设控件的颜色。
例如,CColorCtrlEx<CStatic, RGB(255,0,0), RGB(0,255,0)> m_static;
将创建一个具有初始红色文本和绿色背景的静态控件。
警告! 不要将这两个类与同一个控件一起使用。
CFontCtrl v1.1
如果您想更改控件的字体样式或字体大小,请使用此控件。此类支持以下样式的组合
- 粗体
- 斜体
- 下划线
- 删除线
用法
- 将 FontCtrl.h 包含到您的项目中。
- 使用对话框编辑器创建控件。
- 使用类向导为此控件添加成员变量。
- 将
CCtrlClass m_ctrl
替换为CFontCtrl<CCtrlClass> m_ctrl
例如,替换CEdit m_edit; CStatic m_static;
用
CFontCtrl<CEdit> m_edit; CFontCtrl<CStatic> m_static;
使用以下函数更改字体样式和大小
void ChangeFontStyle(int fAdd, int fRemove = 0, BOOL fRedraw = TRUE); void ChangeFontHeight(int nHeight, BOOL fRedraw = TRUE); void SetFont(CFont* pFont, BOOL bRedraw = TRUE); void SetFont(LOGFONT& lf, BOOL bRedraw = TRUE);
参数 fAdd 和 fRemove 可以由以下值组合而成
FC_FONT_BOLD
FC_FONT_ITALIC
FC_FONT_UNDERLINE
FC_FONT_STRIKEOUT
当您使用 SetFont
函数与 ChangeFont*
函数以任何顺序一起使用时,最终的字体将是 ChangeFontHeight
中指定的样式和大小(如果非零)的组合。
有一个派生类 CFontCtrlEx
,它允许您在模板级别预设字体样式和大小。例如,CFontCtrlEx<CStatic, FC_FONT_BOLD|FC_FONT_UNDERLINE, 30> m_static;
将创建一个具有粗体、下划线文本的静态控件,文本大小为 30。
还有四个用于基本样式的类:CBoldCtrl, CItalicCtrl, CUnderlineCtrl, CStrikeoutCtrl
警告! 不要将这五个类与同一个控件一起使用。
如果您的控件不包含字体(例如,您通过调用 Create
函数在代码中创建它),CFontCtrl
无法更改字体样式/大小。在这种情况下,请使用 SetFont
函数之一为您的控件设置字体。如果您基于这五个派生类之一创建控件,则无需担心——预定义的样式/大小将添加到选定的字体中。
通用说明
任何类的任何函数都可以在窗口创建之前调用。
您可以为单个控件同时使用这两个类。
CFontCtrl<CColorCtrl<CStatic> > m_static; // or CColorCtrl<CFontCtrl<CStatic> > m_static; // or typedef CFontCtrl<CStatic> CFontStatic; CColorCtrl<CFontStatic> m_static; // or even typedef CFontCtrlEx<CStatic, FC_FONT_BOLD|FC_FONT_UNDERLINE, 30> CBoldUnderlineStatic; CColorCtrlEx<CBoldUnderlineStatic, RGB(255,0,0), RGB(0,255,0)> m_static;