自定义属性网格控件实现指南

在软件开发中,属性网格控件是一种常见的界面元素,它允许用户以表格的形式查看和编辑对象的属性。本文将介绍如何实现一个支持多种自定义功能的属性网格控件。

作为开发者,对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并在此处显示它们的模态对话框。

自定义编辑模式项目应该覆盖OnLButtonDownOnMouseMoveOnLButtonUp以实现它们特定的鼠标事件处理。

显示定制

使用各种方法也可以定制网格的渲染:

  • 标题阴影:控制是否为部分标题提供不同的背景颜色。
  • 绘制线条:控制是否显示水平网格线。
  • 边距:控制是否显示属性名称和值之间的垂直线。还可以控制边距的宽度。
  • 禁用焦点:控制是否禁用的项目是否可选。
  • 颜色:使用各种SetXXXColor方法更改用于绘制网格的颜色。

值编辑

可以使用GetItemValueSetItemValue重载来获取特定项目的值。预期的HITEM是在初始化控件时调用AddXXXItem时返回的。确保在调用此函数时调用正确的重载:显然不能从日期项目中获取双精度值,也不能在文本项目中设置LOGFONT。这就是为什么所有这些函数都返回一个布尔值,指示事情是否顺利。

注意事项

必须提醒,这是很久以前写的代码,并且从那时起就没有太大变化。一直想在Codeproject上发布这个,但显然没有找到时间去做。现在它完成了!

只提供了Visual Studio 2005的项目文件,但看不出为什么代码不应该与2003甚至6.0兼容。也许需要做一些小的调整,但应该不会有太大问题。

  • 动态对话框
  • CInPlaceEdit来自Chris的网格控件
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485