1. 定义变量 CTreeCtrl m_T;
2. 显示样式
3. 消息事件
4. 消息事件总结
5. 消息处理注意事项
6. 使用方法
7. 响应NM_CLICK事件的函数代码
void myDialog::OnClickT(NMHDR* pNMHDR,LRESULT* pResult)
{
//添加代码
//获取鼠标位置
CPoint cP;
UINT uF=0;
GetCursorPos(&cP);
m_T.ScreenToClient(&cP);
//获取位置对应的ITEM
HTREEITEM hItem=m_T.HitTest(cP,&uF);
//获取当前选择项ITEM
HTREEITEM hItemSel=m_T.GetSelectItem();
//若鼠标在ITEM外则退出
if(TVHT_NOWHERE & uF)
return;
//处理:传递TVHT_ONITEMSTATEICON
if(TVHT_ONITEMSTATEICON & uF)
{
BOOL bChk=!m_T.GetCheck(hItem);
//父项处理
if(m_T.ItemHasChildren(hItem))
{
HTREEITEM hChildItem=m_T.GetChildItem(hItem);
while(hChildItem!=NULL)
{
m_T.SetCheck(hChildItem,bChk);
hChildItem=m_T.GetNextItem(hChildItem,TVGN_NEXT);
}
}
//兄弟项处理
BOOL bFalse;
bFalse=0;
if(!m_T.ItemHasChildren(hItem))
{
HTREEITEM hParentItem=m_T.GetParentItem(hItem);
if(bChk)
m_T.SetCheck(hParentItem,bChk);
if(!bChk)
{
HTREEITEM hChildItem=m_T.GetChildItem(hItem);
while(hChildItem!=NULL & bFalse==0)
{
if(hChildItem!=hItem)
bFalse=m_T.GetCheck(hChildItem);
hChildItem=m_T.GetNextItem(hChildItem,TVGN_NEXT);
}
if(bFalse==0)
m_T.SetCheck(hParentItem,bChk);
}
}
}
//处理:不传递TVHT_ONITEMSTATEICON
else
{
m_T.SetCheck(hItem,!m_T.GetCheck(hItem));
BOOL bChk=m_T.GetCheck(hItem);
//父项处理
if(m_T.ItemHasChildren(hItem))
{
HTREEITEM hChildItem=m_T.GetChildItem(hItem);
while(hChildItem!=NULL)
{
m_T.SetCheck(hChildItem,bChk);
hChildItem=m_T.GetNextItem(hChildItem,TVGN_NEXT);
}
}
//兄弟项处理
BOOL bFalse;
bFalse=0;
if(!m_T.ItemHasChildren(hItem))
{
HTREEITEM hParentItem=m_T.GetParentItem(hItem);
if(bChk)
m_T.SetCheck(hParentItem,bChk);
if(!bChk)
{
HTREEITEM hChildItem=m_T.GetChildItem(hItem);
while(hChildItem!=NULL & bFalse==0)
{
if(hChildItem!=hItem)
bFalse=m_T.GetCheck(hChildItem);
hChildItem=m_T.GetNextItem(hChildItem,TVGN_NEXT);
}
if(bFalse==0)
m_T.SetCheck(hParentItem,bChk);
}
}
}
//添加代码结束
*pResult=0
}