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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (17投票s)

2000年4月9日

CPOL
viewsIcon

235593

downloadIcon

5149

改变任何标准控件颜色、字体或设置闪烁模式的最简单方法

  • 下载源文件 - 7 Kb
  • 下载演示项目 - 46 Kb
  • Sample Image - CFCtrl.gif

    引言

    在这篇文章中,我想介绍两个模板类,它们可以帮助您进行简单的对话框开发。我们经常尝试为对话框中的静态文本框、编辑框或其他控件设置不同的颜色或字体。为了简化这项工作,我编写了两个类:CColorCtrlCFontCtrl。这些类有两个优点。首先,您无需放弃您喜欢的类。因为这些类是模板,所以它们可以附加到任何现有的 CWnd 类上。其次,这些类没有任何绘制操作。

    CColorCtrl v1.3

    控件有两种工作模式

    • 简单彩色模式
    • 闪烁模式

    您可以自定义

    • 文本颜色(s)
    • 背景颜色(s)
    • 闪烁延迟

    如果您的控件使用 WM_CTLCOLOR 消息进行绘制(几乎所有标准窗口控件都这样做),您就可以使用这个模板。您也可以将其用于整个对话框(请参阅系统菜单中的“关于”对话框)。

    用法

    1. 将 ColorCtrl.h 包含到您的项目中。
    2. 使用对话框编辑器创建一个控件。
    3. 使用类向导为此控件添加成员变量。
    4. 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(),但请注意:如果您使用图案或非纯色,文本下方会有一个与背景不同的矩形。

    有两个派生类 CColorCtrlExCBlinkCtrlEx,它们允许您在模板级别预设控件的颜色。

    例如,CColorCtrlEx<CStatic, RGB(255,0,0), RGB(0,255,0)> m_static; 将创建一个具有初始红色文本和绿色背景的静态控件。

    警告! 不要将这两个类与同一个控件一起使用。

    CFontCtrl v1.1

    如果您想更改控件的字体样式或字体大小,请使用此控件。此类支持以下样式的组合

    • 粗体
    • 斜体
    • 下划线
    • 删除线

    用法

    1. 将 FontCtrl.h 包含到您的项目中。
    2. 使用对话框编辑器创建控件。
    3. 使用类向导为此控件添加成员变量。
    4. 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);
    

    参数 fAddfRemove 可以由以下值组合而成

    • 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;
    

    访问我的主页

    © . All rights reserved.