您的位置:首页 > 其它

CTreeCtrl遍历和checkBox使用及初始化时SetCheck无效解决办法

2012-10-10 14:55 477 查看


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,则不受影响

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐