­

MFC之TreeCtrl遍歷所有節點

  • 2020 年 4 月 11 日
  • 筆記

這個例子,主要是查找樹上的某個節點,並展開選中它。採用來了遞歸方法來實現。主要用到的方法:

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