Este ejemplo es principalmente para encontrar un nodo en el árbol y expandirlo para seleccionarlo. Adopta un método recursivo para lograrlo. Principales métodos utilizados:
CTreeCtrl :: GetChildItem
HTREEITEM GetChildItem (HTREEITEM hItem);
Valor de retorno: si tiene éxito, devuelve el identificador del elemento secundario; de lo contrario, devuelve NULL.
Usando el pensamiento recursivo, trate cada nodo atravesado como el nodo raíz y luego atraviese el nodo hijo en él.
El nodo hijo se considera como el nodo raíz una y otra vez, hasta que se atraviesen los nodos raíz reales y se termine todo el proceso. No está claro ver el código de un vistazo.
Código de botón
void CForTreeCtrlDlg :: OnBnClickedButton1 () { // TODO: Agregar código de controlador de notificación de control UpdateData (TRUE); vector <HTREEITEM> vecItem; HTREEITEM root = treeCtrl.GetRootItem (); // La primera capa del nodo raíz mientras (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); } }
Función recursiva
void CForTreeCtrlDlg :: func (raíz HTREEITEM, condición CString) { CString itemText = treeCtrl.GetItemText (root); if (itemText.Find (condition)! = -1) { treeCtrl.SelectItem (root); treeCtrl.SetCheck (root, TRUE); treeCtrl.Expand (root, TVM_EXPAND); return; } // El nodo hijo del nodo raíz HTREEITEM A1 = treeCtrl.GetChildItem (root); // El nodo hermano del vector del nodo hijo <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 { // recursive, hijo El nodo se utiliza como nodo raíz para recorrer la función (vecItem [q], condición); } } }
Construyendo código de nodo 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; para (int q = 0; q <3; q ++) { str2.Format (TEXT ("% s% d% d% d"), raíz [i], j + 1, m + 1, q + 1); HTREEITEM q1 = treeCtrl.InsertItem (str2, CString str3; para (int s = 0; s <3; s ++) { str3.Format (TEXT ("% s% d% d% d% d"), raíz [i], j + 1, m + 1, q + 1 , s + 1); HTREEITEM s1 = treeCtrl.InsertItem (str3, q1); } } } } }