}
void CTreeTest_demoDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知處理程序代碼
CPoint point;
UINT pflags;
GetCursorPos(&point);
m_ctrTree.ScreenToClient(&point);
HTREEITEM hitItem = m_ctrTree.HitTest( point, &pflags );
if ( pflags & (TVHT_ONITEMSTATEICON ))
{
//if(m_bSelectDirect) // 選中父結點時他的直接孩子(兒子)結點同時被選中
//{
// if ( m_ctrTree.GetCheck( hitItem ) )
// {
// ChangeTreeItemDirect(m_ctrTree,hitItem,FALSE);
// }
// else
// {
// ChangeTreeItemDirect(m_ctrTree,hitItem,TRUE);
// }
//}
// if(m_bSelectAll) // 選中父結點時他的孩子結點以及所有后代(孫子)的節點被選中
{
if ( m_ctrTree.GetCheck( hitItem ) )
{
ChangeTreeItemAll(m_ctrTree,hitItem,FALSE);
}
else
{
ChangeTreeItemAll(m_ctrTree,hitItem,TRUE);
}
}
}
*pResult = 0;
}
方法二:
void CTreeTest_demoDlg::UpdateTreeCheck(const HTREEITEM hParent, const BOOL flag)
{
if (m_ctrTree.ItemHasChildren(hParent))
{
HTREEITEM hNextItem;
HTREEITEM hChildItem = m_ctrTree.GetChildItem(hParent);
while (hChildItem != NULL)
{
//遞歸獲取當前節點下的子節點
m_ctrTree.SetCheck(hChildItem,flag);
UpdateTreeCheck(hChildItem,flag);
hNextItem = m_ctrTree.GetNextItem(hChildItem, TVGN_NEXT);
hChildItem = hNextItem;
}
}
}
void CTreeTest_demoDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知處理程序代碼
DWORD dw = GetMessagePos();
CPoint pt(LOWORD(dw),HIWORD(dw)); //鼠標的屏幕坐標
CPoint ptClient;
CRect rcPart;
m_ctrTree.GetWindowRect(rcPart);
ptClient.x = pt.x - rcPart.left;
ptClient.y = pt.y - rcPart.top;
UINT uFlags;
HTREEITEM hItem = m_ctrTree.HitTest(ptClient, &uFlags);
if ((hItem != NULL) && (uFlags & TVHT_ONITEMSTATEICON))
{
if (m_ctrTree.ItemHasChildren(hItem))
{
BOOL flag = m_ctrTree.GetCheck(hItem); //這時父節點還沒有更新,需要取反
UpdateTreeCheck(hItem,!flag);
}
}
m_ctrTree.Select(hItem, TVGN_CARET);
*pResult = 0;
}