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

CGroupLine

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (25投票s)

2005年11月16日

CPOL

5分钟阅读

viewsIcon

83102

downloadIcon

3252

CStatic 增强功能,添加了一条水平线,并支持 WinXP 主题。

CGroupLine

本文介绍 CGroupLine 类,该类派生自 CStatic,可在静态文本上添加一条水平线,并支持 XP 主题。该控件的外观类似于 Office 2003 中使用的控件(参见 Word 或 Excel 中的“工具 -> 选项”)。

该控件之所以命名为 GroupLine,是因为它非常类似于标准的 GroupBoxGroupLine 控件看起来非常像 GroupBox 的顶部边缘,两者的目的都是将对话框控件分组。区别在于 GroupLine 仅是 GroupBox 的顶部线GroupLine 提供了一种将控件分组的良好方式(这是分组控件的全部目的),但避免了 GroupBox 的缺点(即浪费了左侧、右侧和底部宝贵的对话框空间)。

特点

该图像有助于展示 CGroupLine 的主要功能

  • 文本可以左对齐、居中对齐或右对齐
  • 水平线占据控件内剩余的空间(文本和线之间留有少量间隙)。
  • 默认情况下,主题支持设置为“自动”。该控件会检查应用程序是否启用了主题(部分代码来自 Nishant Sivakumar 的文章),并相应地绘制控件。此自动检测可以被覆盖,并且可以为每个控件以编程方式设置或关闭主题支持(左下角的三个控件已关闭,而它们上方的六个控件则保留为“自动”设置)。
  • 默认情况下,带有主题的标准 GroupBox 在启用和禁用状态下绘制方式相同。这似乎是一种奇怪的行为,因此 CGroupLine 在禁用状态下会以灰显文本绘制。
  • 如果控件未启用主题(没有清单文件/Windows XP 之前的版本/明确关闭),控件仍然会看起来相当不错(参见图像右侧对话框中的控件)。
  • 主题绘制代码可以延迟加载,因此您的应用程序可以在 XP 之前的 Windows 版本中使用(主题绘制仅在 Windows XP 或更高版本上有效)。

使用控件

使用该控件非常简单。本质上,您只需将一个静态文本控件与成员变量关联,并将成员变量的类型从 CStatic 更改为 CGroupLine。类的公共部分在此列出

class CGroupLine : public CStatic 
{
public:
   // controls use of themes (aka visual styles)
   enum eThemeControl {
      eThemeAutomatic, // checks if themes are 
                       // used for the app
      eThemeOff,       // no use of themes
      eThemeOn,        // use themes
   };
    
   // controls how the disabled state is drawn
   enum eDisabledThemeStyle {
      eGrayIfDisabled, // draws disabled state with 
                       // typical disabled gray text
      eSameAsEnabled,  // draws disabled state the same 
                       // as the enabled state (default 
                       // for XP Themed GroupBoxes)
   };

   CGroupLine(eThemeControl useTheme = eThemeAutomatic, 
      eDisabledThemeStyle disabledThemeStyle = eGrayIfDisabled);
   virtual ~CGroupLine();

   void SetUseTheme(eThemeControl useTheme);
   void SetDisabledThemeStyle(
          eDisabledThemeStyle disabledThemeStyle);

关于代码的一些说明

  • 添加控件 - CGroupLine 类派生自 CStatic。要使用该控件,只需在对话框中添加一个普通的静态文本控件,并为其分配一个 ID。将此控件与成员变量关联(例如,使用添加成员变量向导),然后将成员变量的类型从 CStatic 更改为 CGroupLine
  • 尺寸 - 在对话框编辑器中将控件拉伸到所需的宽度。文本将被绘制,剩余的空间将被水平线填充。
  • 水平对齐 - 如果要更改文本对齐方式(即左对齐/右对齐/居中对齐),请使用对话框编辑器在静态控件的属性中更改文本对齐选项。
  • 垂直对齐 - 使用对话框编辑器在静态控件的属性中更改居中图像选项。如果居中图像为 true,则文本和线条将垂直居中。如果为 false,则文本和线条将放置在控件空间的顶部边缘。
  • 禁用状态 - 默认情况下,带有主题的标准 GroupBox 在启用和禁用状态下绘制方式相同。这似乎是一种奇怪的行为,因此 CGroupLine 在禁用状态下会以灰显文本绘制。要将此行为改回默认值(即,使启用和禁用状态以相同方式绘制),请使用 SetDisabledThemeStyle 函数或构造函数的可选参数。
  • 主题 - 要控制主题的使用(强制开启或关闭),请使用 SetUseTheme 函数或构造函数的可选参数。
  • UNICODE - 该控件支持 UNICODE 或 ANSI 生成。
  • 警告 - 在 Visual Studio 2003 中,提供的代码在 4 级警告下可以成功生成。

清单文件

演示中提供的可执行文件需要存在清单文件才能以 XP 主题样式绘制控件。以下文章解释了如何将 XP 清单嵌入到您的可执行文件中,而不是提供单独的清单文件:Jiang Hong 的“通过添加 Windows XP 主题样式来增强现有项目”

该文章中解释的方法适用于本工程,但我使用了单独的清单文件,以便可以轻松地看到添加或删除文件的效果(即,无需重新构建项目即可查看控件在启用或禁用主题下的绘制效果)。

延迟加载 UxTheme.Dll

主题绘制由 UxTheme.Dll 提供,该 DLL 仅在 Windows XP 或更高版本上提供。如果您希望您的应用程序在 XP 之前的 Windows 版本(例如 Windows 2000)上运行,您可能需要延迟加载 UxTheme.Dll

在 Visual Studio 2003 中延迟加载 DLL(对于其他编译器版本,请参阅帮助)

  1. 配置属性 -> 链接器 -> 输入 -> 延迟加载的 DLL -> 添加 -> “UxTheme.DLL”(不带引号)。
  2. 您可能还需要添加对延迟加载 DLL 的支持:配置属性 -> 链接器 -> 输入 -> 附加依赖项 -> 添加 -> “delayimp.lib”(不带引号)。

致谢

本文中的代码包含一个函数 BOOL CGroupLine::IsThemed(),该函数取自 Nishant Sivakumar 的文章:如何准确检测应用程序是否启用了主题

历史

  • 2005-11-16:版本 1.0 - 初始发布。
  • 2008-11-18:添加了 VS 2005 演示
© . All rights reserved.