十五、树形控件(Tree Control)
作用:
树形型控件是将一组信息以树状图的形式体现,数据显示的更有层次。
消息映射函数:
- NM_CLICK : 指示用户在控件中单击鼠标
- NM_DBLICK : 指示用户在控件中双击了一下鼠标
- NM_RCLICK : 用户已在控件内单击了鼠标右键
- TVN_SELCHANGING : 指示选定项即将从一项变为另一项
- TVN_SELCHANGED :指示选定项已经从一项变为另一项
- TVN_ITEMCHANGED :通知TreeView控件的父窗口的特性已经更改
控件属性:
·
- TVS_HASLINES tree view控件的子项与它们的父项之间用线连接。
- TVS_LINESATROOT tree view控件用线连接子项和根项。
- TVS_HASBUTTONS tree view在每一个父项的左边添加一个按钮。
- TVS_EDITLABELS tree view控件允许用户编辑tree view项的标签。
- TVS_SHOWSELALWAYS 当tree view失去焦点时,使被选择的项仍然保持被选择。
- TVS_DISABLEDRAGDROP 该tree view控件被禁止发送。
- TVN_BEGINDRAG 通知消息。
- TVS_NOTOOLTIPS tree view控件使用工具提示。
- TVS_SINGLEEXPAND 当使用这个风格时,改变在tree
view中的选择将导致正被选择的项展开,而没有被选择的项收缩。如果用鼠标单击被选择的项,并且该项是关闭的,则该项就会展开。如果该被选择的项被单击时是打开的,则它就会收缩。
使用方法:以添加和删除树节点为例
1、创建树形控件的控件型变量或者使用GetDlgItem()函数获取控件句柄。
CTreeCtrl m_tree;
2、在添加按钮中使用HTREEITEM hNew = m_tree.InsertItem(&vi),添加树结构的支点,参数为树形结构体(包括父节点,节点名称等信息),返回值为此节点的句柄。
void C树形控件Dlg::OnBnClickedAdd()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
m_edit.GetWindowText(str);
if (str.GetLength() == 0)
{
AfxMessageBox(_T("添加的值不能为空"));
return;
}
HTREEITEM hTree = m_tree.GetSelectedItem(); //获取当前选中的树节点句柄
if (hTree == NULL)
{
hTree = TVI_ROOT;
}
TVINSERTSTRUCT vi = { 0 };//树形控件的结构体
vi.hParent = hTree;//此项为此项的父节点句柄,如果是TVI_ROOT或者为NULL时,则此项为根节点
vi.hInsertAfter = TVI_LAST; //插入此项额句柄值 意味TVI_FIRST 在列表的开始插入项 TVI_LAST 在列表的最后插入项
//TVI_ROOT 作为一个根项添加
// TVI_SORT 以字母顺序插入项
vi.item.pszText = str.GetBuffer();
vi.item.mask = TVIF_TEXT;
HTREEITEM hNew = m_tree.InsertItem(&vi);
m_tree.SelectItem(hNew);
m_tree.EnsureVisible(hNew);
}
3、使用m_tree.DeleteItem(htree);函数删除树节点,参数为选中的支点句柄。
void C树形控件Dlg::OnBnClickedDel()
{
// TODO: 在此添加控件通知处理程序代码
HTREEITEM htree = m_tree.GetSelectedItem();
if (htree == NULL )
{
AfxMessageBox(_T("请选择一个节点"));
return;
}
HTREEITEM hptree = m_tree.GetParentItem(htree);
m_tree.DeleteItem(htree); //删除选中的节点
m_tree.SelectItem(hptree);//将光标移到删除节点的父节点
}