📄 treectrlx.cpp
字号:
// TreeCtrlX.cpp : implementation file
//
#include "stdafx.h"
#include "ResExplorerTree.h"
#include "TreeCtrlX.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTreeCtrlX
CTreeCtrlX::CTreeCtrlX()
{
this->m_pTree=NULL;
}
CTreeCtrlX::~CTreeCtrlX()
{
}
BEGIN_MESSAGE_MAP(CTreeCtrlX, CTreeCtrl)
//{{AFX_MSG_MAP(CTreeCtrlX)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTreeCtrlX message handlers
void CTreeCtrlX::OnLButtonDown(UINT nFlags, CPoint point)
{
UINT uFlags=0;
HTREEITEM hti = HitTest(point,&uFlags);
if( uFlags & TVHT_ONITEMSTATEICON )
{
int ItemState = GetItemState( hti, TVIS_STATEIMAGEMASK )>>12;
SetItemState2( hti, ItemState != 4 ? 4 : 2,
TVIS_STATEIMAGEMASK );
if(ItemState==4) //父节点被取消时,所有子节点都被取消
CheckedAllChild(hti,2);
else //它的父节点被选中时,所有子节点都被选中;
CheckedAllChild(hti,4);
CheckedAllParent(hti);
}else{
CTreeCtrl::OnLButtonDown(nFlags,point);
}
}
BOOL CTreeCtrlX::IsItemChecked(HTREEITEM hItem)
{
return GetItemState( hItem, TVIS_STATEIMAGEMASK )>>12 >= 3;
}
BOOL CTreeCtrlX::IsItemAllChecked(HTREEITEM hItem)
{
return GetItemState( hItem, TVIS_STATEIMAGEMASK )>>12 == 4;
}
HTREEITEM CTreeCtrlX::GetFirstCheckedSibingItem(HTREEITEM hItem)
{
for (HTREEITEM ChildItem = GetChildItem(hItem); ChildItem!=NULL; ChildItem = GetNextSiblingItem( ChildItem ) )
if ( IsItemChecked(ChildItem) )
return ChildItem;
return NULL;
}
HTREEITEM CTreeCtrlX::GetFirstUnAllCheckedSibingItem(HTREEITEM hItem)
{
for (HTREEITEM ChildItem = GetChildItem(hItem); ChildItem!=NULL; ChildItem = GetNextSiblingItem( ChildItem ) )
if ( !IsItemAllChecked(ChildItem) )
return ChildItem;
return NULL;
}
void CTreeCtrlX::CheckedAllChild(HTREEITEM hItem,int State)
{
for (HTREEITEM Child = GetChildItem(hItem); Child!=NULL; Child= GetNextSiblingItem(Child)){
// SetItemState(Child, INDEXTOSTATEIMAGEMASK(State),TVIS_STATEIMAGEMASK );
SetItemState2(Child, State,TVIS_STATEIMAGEMASK );
CheckedAllChild(Child,State);
}
}
void CTreeCtrlX::CheckedAllParent(HTREEITEM hItem)
{
if(GetFirstCheckedSibingItem(GetParentItem(hItem))==NULL){
//所有子节点被取消时,父节点也被取消;
//SetItemState(GetParentItem(hItem), INDEXTOSTATEIMAGEMASK(2),TVIS_STATEIMAGEMASK );
SetItemState2(GetParentItem(hItem), 2,TVIS_STATEIMAGEMASK );
}else if(GetFirstUnAllCheckedSibingItem(GetParentItem(hItem))==NULL){
//当所有子节点完全选中,父节点也被完全选中
// SetItemState(GetParentItem(hItem), INDEXTOSTATEIMAGEMASK(4),TVIS_STATEIMAGEMASK );
SetItemState2(GetParentItem(hItem), 4,TVIS_STATEIMAGEMASK );
}else{//当父节点是取消状态,有一个子节点被选中(完全选中或部分选中),但所有子节点未完全选中时,父节点也被部分选中
// SetItemState(GetParentItem(hItem), INDEXTOSTATEIMAGEMASK(3),TVIS_STATEIMAGEMASK );
SetItemState2(GetParentItem(hItem), 3,TVIS_STATEIMAGEMASK );
}
if(GetParentItem(hItem)!=NULL)
CheckedAllParent(GetParentItem(hItem));
}
BOOL CTreeCtrlX::SetItemState2(HTREEITEM hItem, int nState, UINT nStateMask)
{
SetItemState(hItem, INDEXTOSTATEIMAGEMASK(nState), nStateMask);
//触发状态保存动作
if(this->m_pTree!=NULL){
m_pTree->SetItemState(hItem,nState);
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -