创建一个树形控件:
- TVS_HASLINES 在父/子结点之间绘制连线
- TVS_LINESATROOT 在根/子结点之间绘制连线
- TVS_HASBUTTONS 在每一个结点前添加一个按钮,用于表示当前结点是否已被展开
- TVS_EDITLABELS 结点的显示字符可以被编辑
- TVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点
- TVS_DISABLEDRAGDROP 不允许Drag/Drop
- TVS_NOTOOLTIPS 不使用ToolTip显示结点的显示字符
为树形空间添加结点:
+--- Parent1
+--- Parent2
+--- Parent3
HTREEITEM hItem,hSubItem;
hItem = m_tree.InsertItem("Parent1",TVI_ROOT);
在根结点上添加Parent1
hSubItem = m_tree.InsertItem("Child1_1",hItem);
//在Parent1上添加一个子结点
hSubItem = m_tree.InsertItem("Child1_2",hItem,hSubItem);
//在Parent1上添加一个子结点,排在Child1_1后面
hSubItem = m_tree.InsertItem("Child1_3",hItem,hSubItem);
hItem = m_tree.InsertItem("Parent2",TVI_ROOT,hItem);
hItem = m_tree.InsertItem("Parent3",TVI_ROOT,hItem);
为结点添加图标
m_list.Create(IDB_TREE,16,4,RGB(0,0,0));
m_tree.SetImageList(&m_list,TVSIL_NORMAL);
m_tree.InsertItem("Parent1",0,1);
//添加,选中时显示图标1,未选中时显示图标0
关于控件的状态:
此外CTreeCtrl还提供了一些函数用于得到/修改控件的状态。
此外如果想遍历树可以使用下面的函数:
树形控件的消息映射:
树形控件的消息映射使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,函数的原型如同void OnXXXTree(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。对于树形控件可能取值和对应的数据结构为:
- TVN_SELCHANGED 在所选中的结点发生改变后发送,所用结构:NMTREEVIEW
- TVN_ITEMEXPANDED 在某结点被展开后发送,所用结构:NMTREEVIEW
- TVN_BEGINLABELEDIT 在开始编辑结点字符时发送,所用结构:NMTVDISPINFO
- TVN_ENDLABELEDIT 在结束编辑结点字符时发送,所用结构:NMTVDISPINFO
- TVN_GETDISPINFO 在需要得到某结点信息时发送,(如得到结点的显示字符)所用结构:NMTVDISPINFO
char szOut[8][3]={"No.1","No.2","No.3"};
//添加结点
HTREEITEM hItem = m_tree.InsertItem(LPSTR_TEXTCALLBACK,...)
m_tree.SetItemData(hItem, 0 );
hItem = m_tree.InsertItem(LPSTR_TEXTCALLBACK,...)
m_tree.SetItemData(hItem, 1 );
//处理消息
void CParentWnd::OnGetDispInfoTree(NMHDR* pNMHDR, LRESULT* pResult)
{
//通过lParam得到需要显示的字符在数组中的位置
}
关于编辑结点的显示字符:首先需要设置树形控件的TVS_EDITLABELS风格,在开始编辑时该控件将会发送TVN_BEGINLABELEDIT,你可以通过在处理函数中返回TRUE来取消接下来的编辑,在编辑完成后会发送TVN_ENDLABELEDIT,在处理该消息时需要将参数pNMHDR转换为LPNMTVDISPINFO,然后通过其中的item.pszText得到编辑后的字符,并重置显示字符。如果编辑在中途中取消该变量为NULL。下面的代码说明如何处理这些消息:
//处理消息 TVN_BEGINLABELEDIT
void CParentWnd::OnBeginEditTree(NMHDR* pNMHDR, LRESULT* pResult)
{
}
//处理消息 TVN_BEGINLABELEDIT
void CParentWnd::OnBeginEditTree(NMHDR* pNMHDR, LRESULT* pResult)
{
//重置显示字符
}
上面讲述的方法所进行的消息映射必须在父窗口中进行(同样WM_NOTIFY的所有消息都需要在父窗口中处理)。