CTreeCtrl遍历某一节点以下的全部节点。递归遍历方法://函数说明:返回值:与strId对应的节点. 参数: hItem 查找的起始节点, strId 待查找的数据的标识符,开始用SetItemData设置 ITEMDATA为自定义的数据结构HTREEITEM CMyTree::TreeVisit(HTREEITEM hItem,const CString& strId){//step1:检验开始节点. ITEMDATA *pData=(ITEMDATA*) GetItemData( hItem ); if( pData ) { if( pData->strID.Compare( strID ) == 0 ) return hItem;}//step1:检查子结点HTREEITEM hChildItem= GetChildItem( hItem )HTREEITEM hFindItem=NULL;while( hChildItem ){ hFindItem= TreeVisit(hChildItem , strId) ; //递归 if( hFindItem ) return hFindItem; hChildItem= GetChildItem( hChildItem );}//step2: 检查兄弟结点 HTREEITEM hSlibItem= GetNextItem(hItem,TVGN_NEXT);while( hSlibItem ){hFindItem= TreeVisit(hSlibItem , strId) ; //递归 if( hFindItem ) return hFindItem; hChildItem= GetNextItem(hSlibItem,TVGN_NEXT);}return NULL; //不能少}响应CTreeCtrl中的CheckBox消息添加CTreeCtrl的鼠标单击事件NM_CLICK 加入如下代码 CPoint pt; UINT flag; HTREEITEM hCurrentItem; GetCursorPos(&pt); ScreenToClient(&pt); hCurrentItem = HitTest(pt, &flag); if (flag & TVHT_ONITEMSTATEICON)//是点击CHECK框 { // 检查CheckBox的状态,返回的是在点击之前的状态 // 意思就是得出来是TRUE,那么待会就会是FALSE // 得出来是FALSE,那么待会就会是TRUE // 你在下面进行你自己的处理就可以了 if (m_tree.GetCheck(hCurrentItem)) { } else { } } CTreeCtrl:实现子结点随父结点状态一致的方法: http://www.cnblogs.com/EverYoung/archive/2011/09/21/2184320.htmlCTreeCtrl树控件初始化时SetCheck无效的解决办法对于对话框中的TreeView控件,如果想在初始化(OnInitDialog)中SetCheck,必须:m_tree.ModifyStyle( TVS_CHECKBOXES, 0 );m_tree.ModifyStyle( 0, TVS_CHECKBOXES );m_tree.SetCheck(hItem, TRUE);即即使在对话框编辑器中为TreeView增加了Check Boxes属性,也必须重新设一次TVS_CHECKBOXES,SetCheck才能起作用而对于非初始化中的SetCheck,则不受影响