CGroupLine






4.84/5 (25投票s)
CStatic 增强功能,添加了一条水平线,并支持 WinXP 主题。
CGroupLine
本文介绍 CGroupLine
类,该类派生自 CStatic
,可在静态文本上添加一条水平线,并支持 XP 主题。该控件的外观类似于 Office 2003 中使用的控件(参见 Word 或 Excel 中的“工具 -> 选项”)。
该控件之所以命名为 GroupLine
,是因为它非常类似于标准的 GroupBox
。GroupLine
控件看起来非常像 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(对于其他编译器版本,请参阅帮助)
- 配置属性 -> 链接器 -> 输入 -> 延迟加载的 DLL -> 添加 -> “UxTheme.DLL”(不带引号)。
- 您可能还需要添加对延迟加载 DLL 的支持:配置属性 -> 链接器 -> 输入 -> 附加依赖项 -> 添加 -> “delayimp.lib”(不带引号)。
致谢
本文中的代码包含一个函数 BOOL CGroupLine::IsThemed()
,该函数取自 Nishant Sivakumar 的文章:如何准确检测应用程序是否启用了主题。
历史
- 2005-11-16:版本 1.0 - 初始发布。
- 2008-11-18:添加了 VS 2005 演示