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

CPropTree v1.0 - 属性树控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (61投票s)

2002年1月2日

3分钟阅读

viewsIcon

661054

downloadIcon

12462

支持动态可编辑项的自定义 MFC 树控件。

Sample Image Sample Image Sample Image

引言

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 控件的显示上下文中完成。
© . All rights reserved.