CTreeCtrl操作总结
1.插入结点
InsertItem
第一个参数是结点字符串,第二个参数是父节点句柄,如果没有父节点,就TVI_ROOT
HTREEITEM hitem,hsubitem;
hitem=m_treeCtrl.InsertItem(“Lef 1”,TVI_ROOT);
就插入了第一个节点 Lef 1
要插入它的子结点:
hsubitem=m_treeCtrl.InsertItem(“Lef 1-1”,hitem);
2.如果要让 树控件 有滚动条,在资源里面的 Scroll属性设置为true就可以了。
3.如果要在每个节点前面加上个Check box,那么将资源里面的Check Boxes设置为
true就可以了。
4.要知道选择的结果,可以在父窗口中重写 OnNotify 函数
//处理树形控件复选框被勾选的消息
BOOL CSelDialog::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: 在此添加专用代码和/或调用基类
int idCtrl = (int) wParam;
NMHDR* pnmh = (LPNMHDR) lParam;
UINT UNotifyCode = pnmh-> code;
if (idCtrl==IDC_TREE1 && UNotifyCode==NM_CLICK)
{
NotifyClick();
}
return CDialog::OnNotify(wParam, lParam, pResult);
}
相关的处理都放在 NotifyClick函数中。
void CSelDialog::NotifyClick(void)
{
HTREEITEM hClickItem;
UINT nFlags;
//首先获得光标的位置
CPoint curPoint;
GetCursorPos(&curPoint);
m_treeCtrl.ScreenToClient(&curPoint);
//然后调用CTreeCtrl的HitTest函数来返回点击的是那个ITEM结点。
hClickItem=m_treeCtrl.HitTest(curPoint,&nFlags);
//选中Check
if ((hClickItem) && (TVHT_ONITEM & nFlags) )
{
GetCheckChange(hClickItem,nFlags);
}
return;
}
如果是点击了,那么调用GetCheckChange通知具体的ITEM结点。
接下来就是处理具体的了。
5.要让一个ITEM被选中,调用 SelectItem(hItem)
6.要获得一个ITEM的字符串,调用 GetItemText(hItem)
7.要获得一个ITEM前的Check BOx是否被选中,调用GetCheck,反正,
调用SetCheck
8.对树的遍历
首先调用 ItemHasChildren(hitem)来判断是否有子树
如果有就遍历。
然后调用 GetChildItem 来获得第一个孩子的hitem,然后一个while循环
在里面调用 GetNextSiblingItem获得下一个孩子结点。 同时递归当前孩子,
如果当前孩子有孩子,那么递归。
代码如下:
if (m_treeCtrl.ItemHasChildren(treeitem))
{
parent_sel_item=treeitem;
tempitem=m_treeCtrl.GetChildItem(treeitem);
while (tempitem)
{
if (bCheck)
{
m_treeCtrl.SetCheck(tempitem,false);
}
else
{
m_treeCtrl.SetCheck(tempitem,true);
}
tempitem=m_treeCtrl.GetNextSiblingItem(tempitem);
}
}
9.如何对树控件节点进行排序,用SortChildrenCB成员函数
TVSORTCB tvs;
tvs.hParent=PartentItem;
tvs.lParam=(LPARAM)&m_TreeChannel;
tvs.lpfnCompare=lpfuc;
BOOL bRet=m_TreeChannel.SortChildrenCB(&tvs);
其中 lpfuc是一个回调函数
定义如下:
typedef int (CALLBACK * LPTREESORTFUC ) (LPARAM lParam1,LPARAM lParam2, LPARAM lParamSort );
//回调函数
static int CALLBACK
MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
// lParamSort contains a pointer to the tree control.
// The lParam of an item is just its handle.
CTreeCtrl* pmyTreeCtrl = (CTreeCtrl*) lParamSort;
CString strItem1 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam1);
CString strItem2 = pmyTreeCtrl->GetItemText((HTREEITEM) lParam2);
return strcmp(strItem2, strItem1);
}
上面是微软的MSDN给出的回调函数的例子,其中lparam1,lparam2是你在SetItemData中设置的值,这里先前被设置的显然就是本节点的 HITREEITEM
要决定排序的顺序,如果返回 《0,那么就将第一个结点排在前面,如果返回>0,那么就将前后两个结点元素颠倒过来,如果返回0,那么认为他们两个是相等的。