⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treectrlx.cpp

📁 1)动态加载中间(2)规范化中间层接口 (3)解释本地文件系统(4)基于数据库的数据提供(5)数据库设计(6)优化数据提供逻辑(7)程序框架结构图
💻 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 + -