MFC之TreeCtrl遍历所有节点
这个例子,主要是查找树上的某个节点,并展开选中它。采用来了递归方法来实现。主要用到的方法:
CTreeCtrl::GetChildItem
HTREEITEM GetChildItem( HTREEITEM hItem );
返回值:如果成功则返回该子项的句柄;否则返回NULL。
采用递归的思想,把每个遍历到的节点都当作根节点对待,然后遍历他里面的儿子节点。
儿子节点又当作根节点,这样反复,直到真正的根节点都遍历完了,整个过程就结束了。说得不清楚,看代码一目了然。
按钮代码
void CForTreeCtrlDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); vector<HTREEITEM>vecItem; HTREEITEM root = treeCtrl.GetRootItem(); //第一层根节点 while (root != NULL) { vecItem.push_back(root); root = treeCtrl.GetNextItem(root, TVGN_NEXT); } for (int q = (int)vecItem.size() - 1; q > -1; q--) { func(vecItem[q], m_find); } }
递归函数
void CForTreeCtrlDlg::func(HTREEITEM root,CString condition) { CString itemText = treeCtrl.GetItemText(root); if (itemText.Find(condition) != -1) { treeCtrl.SelectItem(root); treeCtrl.SetCheck(root, TRUE); treeCtrl.Expand(root, TVM_EXPAND); return; } //根节点的儿子节点 HTREEITEM A1 = treeCtrl.GetChildItem(root); //儿子节点的兄弟节点 vector<HTREEITEM>vecItem; while (A1 != NULL) { vecItem.push_back(A1); A1 = treeCtrl.GetNextItem(A1, TVGN_NEXT); } for (int q = (int)vecItem.size() - 1; q > -1; q--) { CString itemText = treeCtrl.GetItemText(vecItem[q]); if (itemText.Find(condition) != -1) { treeCtrl.SelectItem(vecItem[q]); treeCtrl.SetCheck(vecItem[q], TRUE); treeCtrl.Expand(vecItem[q], TVM_EXPAND); vecItem.clear(); return; } else { //递归,儿子节点当作根节点遍历 func(vecItem[q], condition); } } }
构建treeCtrl节点代码
// TODO: 在此添加额外的初始化代码 CString root[2] = { TEXT("A"),TEXT("B") }; for (int i=0;i<2;i++) { HTREEITEM r =treeCtrl.InsertItem(root[i], NULL); CString str; for (int j=0;j<3;j++) { str.Format(TEXT("%s%d"),root[i], j + 1); HTREEITEM j1 = treeCtrl.InsertItem(str, r); CString str1; for (int m = 0; m < 3; m++) { str1.Format(TEXT("%s%d%d"), root[i], j + 1,m+1); HTREEITEM m1 = treeCtrl.InsertItem(str1, j1); CString str2; for (int q = 0; q < 3; q++) { str2.Format(TEXT("%s%d%d%d"), root[i], j + 1, m + 1,q+1); HTREEITEM q1 = treeCtrl.InsertItem(str2, m1); CString str3; for (int s = 0; s < 3; s++) { str3.Format(TEXT("%s%d%d%d%d"), root[i], j + 1, m + 1, q + 1,s+1); HTREEITEM s1 = treeCtrl.InsertItem(str3, q1); } } } } }