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

一个完全可自定义的属性网格

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (53投票s)

2007年5月25日

CPOL

5分钟阅读

viewsIcon

249993

downloadIcon

12683

一个用于显示和编辑对象属性的网格(类似于 Visual Studio)。

Screenshot - PropertyGrid.jpg

引言

本文实现了一个完全可定制的属性网格,如上屏幕截图所示。该网格支持各种类型的项目:字符串、组合框、文件选择器……它还支持完全可定制的项目,这些项目可以定义它们的绘制方式、用户如何与它们交互以及它们在编辑时的行为。

背景

作为开发人员,我们现在都习惯了 Visual Studio 的属性窗口,本文就是对此的实现。它不支持帮助区域,并且尽管控件支持不同的显示类型(分类、字母顺序……),但没有提供标准的按钮。

使用代码

提供的示例应用程序展示了该控件几乎所有的功能。因此,鼓励您解析源代码以了解该控件!

首先,我们在对话框中放置了一个虚拟控件(在本例中是一个图片控件),并在头文件中将其类型重写为 CPropertyGrid。在对话框的 OnInitDialog 中,我们使用各种方法初始化控件。

  • AddSection:用于添加一组属性(参见屏幕截图中的“基本项”)。
  • AddXXXItem:用于向节添加项(有关各种项类型,请参见下文)。
  • SetXXXStrings:用于本地化 CPropertyGrid 使用的标准对话框(参见下文)。

基本上,如果我们唯一想做的事情是显示标准属性,那么我们就完成了!

标准项类型

如前所述,该控件支持不同的项,因此以下是对这些类型的简要描述:

  • AddStringItem:一个简单的单行字符串项。字符串可以就地编辑。
  • AddTextItem:一个多行字符串项。编辑时,CPropertyGrid 会动态生成一个对话框,允许用户输入文本。
  • AddIntegerItem:一个整数值项。可以提供可选的格式掩码。
  • AddDoubleItem:一个浮点数值项。可以提供可选的格式掩码。
  • AddComboItem:一个允许从一组值中选择的项。可能的值作为 vector<string> 传递。
  • 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 中也能正常工作,没有理由不这样做。可能需要进行一些小的调整,但这应该不是大问题。

我使用了 codeproject.com 上提供的另外两篇文章。

结论

编写这个控件很有趣,特别是支持完全自定义项。我对该控件的描述并未涵盖其所有方面,我鼓励您查看其头文件,以发现我没有花时间讨论的内容。尽管如此,我希望这篇短文能让您看到该控件的所有可能性!

© . All rights reserved.