zoukankan      html  css  js  c++  java
  • 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);
    					}
    				}
    			}
    		}
    	}
    
  • 相关阅读:
    vim的script、function及command
    Vim中如何移动光标
    command模式下命令的匹配及help内容的搜索
    为什么vim编辑模式下ctrl-w可以前向删除单词及按键映射的展开
    gcc如何实现C++中函数auto返回类型推导
    sqlserver 列转行
    【java笔记】可变长参数(...)
    【c#笔记】可变长参数(params)
    【c#笔记】c#与java的差异:接口定义实现
    【java笔记】Calendar类的陷阱
  • 原文地址:https://www.cnblogs.com/HelloQLQ/p/12678753.html
Copyright © 2011-2022 走看看