MFC之TreeCtrl遍历所有节点

2021-02-21 00:17

阅读:476

标签:find   mamicode   code   思想   clear   i++   upd   child   round   

技术图片

这个例子,主要是查找树上的某个节点,并展开选中它。采用来了递归方法来实现。主要用到的方法:

CTreeCtrl::GetChildItem
HTREEITEM GetChildItem( HTREEITEM hItem );
返回值:如果成功则返回该子项的句柄;否则返回NULL。

技术图片

技术图片

采用递归的思想,把每个遍历到的节点都当作根节点对待,然后遍历他里面的儿子节点。
儿子节点又当作根节点,这样反复,直到真正的根节点都遍历完了,整个过程就结束了。说得不清楚,看代码一目了然。

按钮代码

void CForTreeCtrlDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码

	UpdateData(TRUE);

	vectorvecItem;
	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);

	//儿子节点的兄弟节点
	vectorvecItem;

	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

 

MFC之TreeCtrl遍历所有节点

标签:find   mamicode   code   思想   clear   i++   upd   child   round   

原文地址:https://www.cnblogs.com/HelloQLQ/p/12678753.html


评论


亲,登录后才可以留言!