CPropTree v1.0 - 属性树控件






4.92/5 (61投票s)
2002年1月2日
3分钟阅读

661054

12462
支持动态可编辑项的自定义 MFC 树控件。
引言
CPropTree
类实现了一个类似于 Visual Studio .Net 中属性视图的树控件。源项目编译为一个 DLL,因此您可以轻松地将其合并到您的项目中。您可以查看我的网页以获取有关该控件的更多信息。
该控件有两个窗口区域
- 树控件
- 描述区域
树控件部分的功能就像一个普通的树控件,增加了一个分隔树项目属性的分隔条。树项目属性继承自 CPropTreeItem
类。这些项目可以是编辑控件、静态文本、下拉组合列表或您想要创建的任何类型的控件。树控件根级别的项目没有可编辑的属性。它们用作节标题。
树项目可以包含复选框。默认情况下,可编辑(非只读)的属性以粗体字母显示。只读或不可编辑的项目以正常字体显示。
描述区域显示所选项目的文本和任何信息文本。可以通过调用 CPropTree::ShowInfoText()
来显示或隐藏此部分。
实现
要使用该控件,请在您的对话框或视图类头文件中创建该类的一个实例。在 OnInitDialog()
或 OnCreate()
中初始化该控件
DWORD dwStyle; CRect rc; // PTS_NOTIFY - CPropTree will send notification messages to the parent window dwStyle = WS_CHILD|WS_VISIBLE|PTS_NOTIFY; // Init the control's size to cover the entire client area GetClientRect(rc); // Create CPropTree control m_Tree.Create(dwStyle, rc, this, IDC_PROPERTYTREE);
要向控件添加项目,请动态创建由 CPropTreeItem
类继承的对象,并调用 CPropTree::InsertItem()
方法。
CPropTreeItem* pItem1; pItem1 = m_Tree.InsertItem(new CPropTreeItem()); pItem1->SetLabelText(_T("Properties")); pItem1->SetInfoText(_T("This is a root level item")); CPropTreeItem* pItem2; pItem2 = m_Tree.InsertItem(new CPropTreeItemEdit(), pItem1); pItem2->SetLabelText(_T("EditItem")); pItem2->SetInfoText(_T("This is a child item of Properties, with an edit control")); pItem2->SetItemValue((LPARAM)_T("This is some default text for the edit control"));
高级功能
通知消息
该控件使用 WM_NOTIFY
通知消息来指示事件。向父窗口添加一个 ON_NOTIFY
消息处理程序来处理通知。该控件支持大多数常见的 NM_ 代码,并添加了以下 CPropTree
特定的 WM_NOTIFY
代码。
PTN_INSERTITEM
当插入一个项目时PTN_DELETEITEM
当一个项目即将被删除时PTN_DELETEALLITEMS
当调用删除所有项目时PTN_ITEMCHANGED
当一个项目的属性已被修改时PTN_SELCHANGE
当当前选择更改时PTN_ITEMEXPANDING
当一个项目即将展开或关闭时PTN_COLUMNCLICK
当鼠标点击分隔条时PTN_PROPCLICK
当鼠标点击一个项目的属性区域时PTN_CHECKCLICK
当鼠标点击一个项目的复选框时
PTN_
通知消息返回 NMPROPTREE
结构。您可以使用此结构以及 CPropTreeItem::SetCtrlID()
方法来确定发送事件的树项目。
[...] //}}AFX_MSG_MAP ON_NOTIFY(PTN_ITEMCHANGED, IDC_PROPERTYTREE, OnItemChanged) END_MESSAGE_MAP() void CMyDialog::OnItemChanged(NMHDR* pNotifyStruct, LRESULT* plResult) { LPNMPROPTREE pNMPropTree = (LPNMPROPTREE)pNotifyStruct; if (pNMPropTree->pItem) { // retrieve pItem's changed data } *plResult = 0; }
自定义属性项
该库已经有一些默认的派生 CPropTreeItem
类可以使用。例如,编辑控件 CPropTreeItemEdit
、颜色选择器 CPropTreeItemColor
、下拉组合框 CPropTreeItemCombo
和静态文本 CPropTreeItemStatic
。要创建您自己的自定义属性项
- 创建您自己的由
CPropTreeItem
继承的类。这个类通常会有多个继承,具体取决于您想要创建的项目类型。class CMyCustomEditPropItem : public CEdit, public CPropTreeItem { public: CMyCustomEditPropItem(); virtual ~CMyCustomEditPropItem(); [...] };
class CMyCustomComboBoxPropItem : public CComboBox, public CPropTreeItem { public: CMyCustomComboBoxPropItem(); virtual ~CMyCustomComboBoxPropItem(); [...] };
- 重写
CPropTreeItem
虚方法来实现您的属性项。 - 动态创建您的类的一个实例,并将其插入到
CPropTree
控件中。
最常从 CPropTreeItem
重写的方法是
CPropTreeItem::OnActivate()
。当鼠标点击属性区域或在所选项目上按下 Enter 键时调用。OnActivate()
方法是您显示属性项目的窗口(如果它有一个窗口)(例如编辑控件或弹出菜单)的地方。CPropTreeItem::OnCommit()
。当数据被提交时调用。在这个方法中,您将提取更改的数据并隐藏属性项目的窗口。当调用CommitChanges()
时,会调用OnCommit()
。派生的CPropTreeItem
类会在失去输入焦点或按下“Enter”键时调用CommitChanges()
,就像在编辑控件中一样。CPropTreeItem::DrawAttribute()
。当需要显示属性项目时,CPropTree
会调用DrawAttribute()
。绘图直接在 PropTree 控件的显示上下文中完成。