在软件开发中,属性网格控件是一种常见的界面元素,它允许用户以表格的形式查看和编辑对象的属性。本文将介绍如何实现一个支持多种自定义功能的属性网格控件。
作为开发者,对Visual Studio的属性窗口非常熟悉。本文介绍的控件实现与之类似,但不支持帮助区域,尽管控件支持多种显示类型(如分类、按字母顺序等),但并未提供标准按钮。
提供的示例应用程序几乎展示了控件的所有功能。因此,强烈建议解析源代码以了解控件的更多信息。
首先,在对话框中放置了一个虚拟控件(以图片控件为例),并在头文件中重写了控件的类型为CPropertyGrid
。在对话框的OnInitDialog
中,使用各种方法初始化控件:
AddSection
:用于添加一组属性(参见截图中的"基本项目")AddXXXItem
:用于向一个部分添加项目(参见下面的各种项目类型)SetXXXStrings
:用于本地化CPropertyGrid
使用的标凈对话框(参见下面)基本上,如果只想显示标准属性,那么到这里就足够了!
如前所述,控件支持不同类型的项目,以下是这些类型的快速描述:
AddStringItem
:一个简单的单行字符串项目。字符串可以就地编辑。AddTextItem
:一个多行字符串项目。编辑时,CPropertyGrid
动态生成一个对话框,允许用户输入文本。AddIntegerItem
:一个整数值项目。可以提供一个可选的格式化掩码。AddDoubleItem
:一个浮点值项目。可以提供一个可选的格式化掩码。AddComboItem
:一个允许从一组值中选择的项目。可能的值作为vector
传递。AddBoolItem
:一个布尔值项目,其行为类似于组合框项目。可以使用SetTrueFalseStrings
设置"True"和"False"文本。AddDateItem
:一个日期值项目,使用CMonthCalCtrl
派生控件选择。AddDateTimeItem
:一个日期和时间值项目,使用动态生成的对话框设置。AddFileItem
:一个允许使用标准CFileDialog
选择文件的项目。可以提供一个过滤器列表。AddFolderItem
:一个允许使用"标准"目录选择器对话框选择文件夹的项目。AddColorItem
:一个允许使用标准CColorDialog
选择颜色的项目。AddFontItem
:一个允许使用标准CFontDialog
选择字体的项目。CPropertyGrid
还支持完全自定义的项目。要实现自定义项目,只需创建一个新类并使其派生自ICustomItem
并实现该接口的各种方法。然后创建类的实例,并使用AddCustomItem
将其添加到网格控件中。
ICustomItem
的两个方法是纯虚的,必须被覆盖:
GetEditMode
:告诉网格控件在编辑值时使用的交互方式。示例应用程序展示了四种自定义项目,实现了各种编辑模式。DrawItem
:覆盖此方法以绘制自定义项目。这可以简单到调用提供的CDC
上的DrawText
。接下来,根据编辑模式,可能需要覆盖更多方法以自定义项目。为了更好地理解这是如何工作的,建议检查示例应用程序中实现的各种自定义项目:
CSerialItem
用于就地编辑,CRectItem
用于模态编辑,CTreeItem
用于下拉编辑,CGradientItem
用于完全自定义项目。就地编辑的项目应该覆盖GetStringForInPlaceEdit
(告诉网格应该编辑的字符串)和OnItemEdited
(返回false以放弃编辑)。
下拉自定义项目应该覆盖ShowDropDown
并在此处显示它们的下拉控件。
模态自定义项目应该覆盖OnEditItem
并在此处显示它们的模态对话框。
自定义编辑模式项目应该覆盖OnLButtonDown
、OnMouseMove
和OnLButtonUp
以实现它们特定的鼠标事件处理。
使用各种方法也可以定制网格的渲染:
SetXXXColor
方法更改用于绘制网格的颜色。可以使用GetItemValue
和SetItemValue
重载来获取特定项目的值。预期的HITEM
是在初始化控件时调用AddXXXItem
时返回的。确保在调用此函数时调用正确的重载:显然不能从日期项目中获取双精度值,也不能在文本项目中设置LOGFONT
。这就是为什么所有这些函数都返回一个布尔值,指示事情是否顺利。
必须提醒,这是很久以前写的代码,并且从那时起就没有太大变化。一直想在Codeproject上发布这个,但显然没有找到时间去做。现在它完成了!
只提供了Visual Studio 2005的项目文件,但看不出为什么代码不应该与2003甚至6.0兼容。也许需要做一些小的调整,但应该不会有太大问题。
CInPlaceEdit
来自Chris的网格控件