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.html
CTreeCtrl树控件初始化时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,则不受影响