www.pudn.com > VX.rar > MyTreeView.cpp


// MyTreeView.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "DTASvm.h" 
#include "DTASvmDoc.h" 
#include "MyTreeView.h" 
#include "DTASvmView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
extern CDTASvmView* g_pDTASView; 
///////////////////////////////////////////////////////////////////////////// 
// CMyTreeView 
 
IMPLEMENT_DYNCREATE(CMyTreeView, CTreeView) 
 
CMyTreeView::CMyTreeView() 
{ 
} 
 
CMyTreeView::~CMyTreeView() 
{ 
} 
 
static CString csTree[] = 
{ 
	_T("图层控制"), //  csTree[30]~0 
 
	_T("【专题图层】"),	//~1 
 
	_T("『人口情况』"),  //~2 
	_T("『政治情况』"), 
	_T("『经济情况』"), 
	_T("『工业情况』"), 
	_T("『农业情况』"), 
	_T("『商业情况』"), 
	_T("『环境情况』"), 
	_T("『其他情况』"), 
 
	_T("【底层数据】"), //~10 
 
	_T("〖居民地〗"),	//~11 
	_T("『省 会』"), 
	_T("『地级市』"), 
	_T("『县级市』"), 
	_T("『乡 镇』"), 
	_T("『村级以下』"), 
 
	_T("〖交通层〗"),	//~17 
	_T("『国 道』"), 
	_T("『省 道』"), 
	_T("『高速公路』"), 
	_T("『县以下级』"), 
	_T("『铁 路』"), 
 
	_T("〖水 系〗"),	//~23 
	_T("『面状水系』"), 
	_T("『线状水系』"), 
	_T("『水系注记』"), 
 
	_T("〖境 界〗"),	//~27 
 
	_T("〖地 貌〗"),	//~28 
 
	_T("〖经纬线〗")	//~29 
}; 
BEGIN_MESSAGE_MAP(CMyTreeView, CTreeView) 
	//{{AFX_MSG_MAP(CMyTreeView) 
	ON_WM_CREATE() 
	ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding) 
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged) 
	ON_WM_LBUTTONDOWN() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyTreeView drawing 
 
void CMyTreeView::OnDraw(CDC* pDC) 
{ 
	CDocument* pDoc = GetDocument(); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyTreeView diagnostics 
 
#ifdef _DEBUG 
void CMyTreeView::AssertValid() const 
{ 
	CTreeView::AssertValid(); 
} 
 
void CMyTreeView::Dump(CDumpContext& dc) const 
{ 
	CTreeView::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyTreeView message handlers 
 
int CMyTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CTreeView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	m_TreeCtrl = &GetTreeCtrl(); 
	 
	// 创建条目图标 
	m_ImageList.Create (IDB_IL_CLASS, 16, 1, RGB(255,255,255)); 
	m_TreeCtrl->SetImageList (&m_ImageList, TVSIL_NORMAL); 
	//m_TreeCtrl->SetBkColor(::GetSysColor(COLOR_MENU)); 
	// add the mainparent item 
	htiParent = m_TreeCtrl->InsertItem (csTree[0]); 
	m_TreeCtrl->SetItemState(htiParent, TVIS_BOLD, TVIS_BOLD); //设置粗字体 
 
	// add the children of the '图层控制' item 
	htiFChild[0] = m_TreeCtrl->InsertItem (csTree[1],3, 4, htiParent, TVI_LAST); 
 
	// add the children of the '专题图层' item 
	for (int i = 0; i < 8; i++)  
		htiCChild[i] = m_TreeCtrl->InsertItem (csTree[i+2], 3, 4, htiFChild[0], TVI_LAST); 
	 
	// add the children of the '图层控制' item 
    htiFChild[1] = m_TreeCtrl->InsertItem (csTree[10], 5, 5, htiParent, TVI_LAST);    
     
	// add "居民地" and its' children item  
	htiFChild[2] = m_TreeCtrl->InsertItem (csTree[11], 5, 5, htiFChild[1], TVI_LAST); 
	for (int k = 0; k < 5; k++) { 
		htiCChild[k+8] = m_TreeCtrl->InsertItem (csTree[k+12], 5, 5, htiFChild[2], TVI_LAST); 
	} 
 
    // add "交通层" and its' children item 
	htiFChild[3] = m_TreeCtrl->InsertItem (csTree[17], 3, 4, htiFChild[1], TVI_LAST); 
	for (int l = 0; l < 5; l++) { 
		htiCChild[l+13] = m_TreeCtrl->InsertItem (csTree[l+18], 3, 4, htiFChild[3], TVI_LAST); 
	} 
 
    // add "水  系" and its' children item 
	htiFChild[4] = m_TreeCtrl->InsertItem (csTree[23], 5, 5, htiFChild[1], TVI_LAST); 
	for (int m = 0; m < 3; m++) { 
		htiCChild[m+18] = m_TreeCtrl->InsertItem (csTree[24+m], 5, 5, htiFChild[4], TVI_LAST); 
	} 
 
	// add "境  界","地  貌","经纬网" item here 
	for (int n = 0; n < 3; n++) { 
		htiCChild[n+21] = m_TreeCtrl->InsertItem (csTree[27+n], 5, 5, htiFChild[1], TVI_LAST); 
	} 
 
	m_TreeCtrl->Expand (htiParent, TVE_EXPAND); 
	m_TreeCtrl->Expand (htiFChild[0], TVE_EXPAND); 
	m_TreeCtrl->Expand (htiFChild[1], TVE_EXPAND); 
//	m_TreeCtrl->Expand (htiFChild[2], TVE_EXPAND); 
//	m_TreeCtrl->Expand (htiFChild[3], TVE_EXPAND); 
//	m_TreeCtrl->Expand (htiFChild[4], TVE_EXPAND); 
//	m_TreeCtrl->SelectSetFirstVisible(htiCChild[23]); 
	SetStateIcon();	 
	return 0; 
} 
 
BOOL CMyTreeView::PreCreateWindow(CREATESTRUCT& cs)  
{ 
	cs.style |= TVS_HASBUTTONS | TVS_HASLINES | TVS_SHOWSELALWAYS;//TVS_LINESATROOT | 
	 
	return CTreeView::PreCreateWindow(cs); 
} 
 
void CMyTreeView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; 
	// TODO: Add your control notification handler code here 
	 
	*pResult = 0; 
} 
 
void CMyTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; 
	// TODO: Add your control notification handler code here 
	 
	*pResult = 0; 
} 
 
void CMyTreeView::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	UINT uFlags = 0; 
	HTREEITEM hItem = m_TreeCtrl->HitTest(point, &uFlags); 
	if(uFlags & TVHT_ONITEMSTATEICON) 
	{ 
		SetCheck(hItem); 
 
		if( g_pDTASView ) 
		{ 
			//g_pMTGISView->Invalidate(FALSE); 
 
			//g_pMTGISView->SendMessage( WM_USER+300 ); 
 
			//::SendMessage(0,WM_USER+300,0,0); 
			//g_pMTGISView->Test(); 
			g_pDTASView->Invalidate(TRUE); 
			return; 
 
		} 
		//CMTGISDoc* pDoc = (CMTGISDoc*)this->GetDocument(); 
		//CMainFrame* pmainwin = (CMainFrame*)AfxGetApp()->m_pMainWnd; 
		//CMTGISView* pView = (CMTGISView*) pmainwin->GetActiveView(); 
		//pmainwin->Invalidate(TRUE); 
		//pView->SendMessage(WM_COMMAND,IDR_CLOCK); 
		//pView->Invalidate(TRUE); 
		return; 
	}	 
	CTreeView::OnLButtonDown(nFlags, point); 
} 
BOOL CMyTreeView::SetCheck(HTREEITEM hItem) 
{ 
	if(hItem == NULL) 
		return FALSE; 
	UINT nState = m_TreeCtrl->GetItemState(hItem,TVIS_STATEIMAGEMASK) >> 12; 
	//确定新的复选状态 
 
	switch(nState) 
		{ 
			case FUNCHECKED: nState = FCHECKED; break; 
			case FCHECKED: nState = FUNCHECKED; break; 
			case CUNCHECKED: nState = CCHECKED; break; 
			case CCHECKED: nState = CUNCHECKED; break; 
		} 
	m_TreeCtrl->SetItemState(hItem,INDEXTOSTATEIMAGEMASK(nState),TVIS_STATEIMAGEMASK); 
	SetNowFlags(hItem , nState); 
/////////////////////////////////////////////////////////////////////////////////////////	 
	if(nState == CCHECKED) 
	{ 
		//标记父条目 
		while((hItem = m_TreeCtrl->GetParentItem(hItem)) != NULL) 
		{ 
			nState = m_TreeCtrl->GetItemState(hItem , TVIS_STATEIMAGEMASK)>>12; 
			if(nState == FUNCHECKED) 
			{ 
				m_TreeCtrl->SetItemState(hItem,INDEXTOSTATEIMAGEMASK(FCHECKED),TVIS_STATEIMAGEMASK); 
				SetNowFlags(hItem , FCHECKED); 
			} 
		} 
	} 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
	else if(nState == FCHECKED) 
	{ 
		//如果父条目被选,则它的子父条目都需要更新 
		//标记子条目 
		HTREEITEM htiChild = m_TreeCtrl->GetChildItem(hItem) ; 
		do  
		{ 
			if(m_TreeCtrl->ItemHasChildren(htiChild) == TRUE) 
			{ 
				m_TreeCtrl->SetItemState(htiChild,INDEXTOSTATEIMAGEMASK(FCHECKED),TVIS_STATEIMAGEMASK); 
				SetNowFlags(htiChild , FCHECKED); 
 
				HTREEITEM htiChild_ = m_TreeCtrl->GetChildItem(htiChild); 
				do 
				{				 
					m_TreeCtrl->SetItemState(htiChild_,INDEXTOSTATEIMAGEMASK(CCHECKED),TVIS_STATEIMAGEMASK); 
					SetNowFlags(htiChild_ , CCHECKED); 
				} 
				while((htiChild_ = m_TreeCtrl->GetNextItem(htiChild_ , TVGN_NEXT)) != NULL); 
			} 
			else 
//				do 
				{				 
					m_TreeCtrl->SetItemState(htiChild,INDEXTOSTATEIMAGEMASK(CCHECKED),TVIS_STATEIMAGEMASK); 
					SetNowFlags(htiChild , CCHECKED); 
				} 
//				while((htiChild = m_TreeCtrl->GetNextItem(htiChild , TVGN_NEXT)) != NULL);			 
 
		} 
		while((htiChild = m_TreeCtrl->GetNextItem(htiChild , TVGN_NEXT)) != NULL); 
 
		//标记父条目 
		HTREEITEM htiFather = hItem ; 
		while((htiFather = m_TreeCtrl->GetParentItem(htiFather)) != NULL) 
		{ 
			nState = m_TreeCtrl->GetItemState(htiFather , TVIS_STATEIMAGEMASK)>>12; 
			if(nState == FUNCHECKED) 
			{ 
				m_TreeCtrl->SetItemState(htiFather , INDEXTOSTATEIMAGEMASK(FCHECKED),TVIS_STATEIMAGEMASK); 
				SetNowFlags(htiFather , FCHECKED); 
			} 
		} 
	} 
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
	else if(nState == FUNCHECKED) 
	{ 
		//如果父条目没有被选,则它的子父条目都需要更新 
		// 更新子条目 
		HTREEITEM htiChild = m_TreeCtrl->GetChildItem(hItem) ; 
		 
		do { 
			if(m_TreeCtrl->ItemHasChildren(htiChild) == TRUE) 
			{ 
				m_TreeCtrl->SetItemState(htiChild,INDEXTOSTATEIMAGEMASK(FUNCHECKED),TVIS_STATEIMAGEMASK); 
				SetNowFlags(htiChild , FUNCHECKED); 
				HTREEITEM htiChild_ = m_TreeCtrl->GetChildItem(htiChild); 
				do 
				{				 
					m_TreeCtrl->SetItemState(htiChild_,INDEXTOSTATEIMAGEMASK(CUNCHECKED),TVIS_STATEIMAGEMASK); 
					SetNowFlags(htiChild_ , CUNCHECKED); 
				} 
				while((htiChild_ = m_TreeCtrl->GetNextItem(htiChild_ , TVGN_NEXT)) != NULL); 
			} 
			else 
				do 
				{ 
					m_TreeCtrl->SetItemState(htiChild,INDEXTOSTATEIMAGEMASK(CUNCHECKED),TVIS_STATEIMAGEMASK); 
					SetNowFlags(htiChild , CUNCHECKED); 
				} 
				while((htiChild = m_TreeCtrl->GetNextItem(htiChild , TVGN_NEXT)) != NULL);			 
 
		}while ((htiChild = m_TreeCtrl->GetNextItem(htiChild , TVGN_NEXT)) != NULL);	 
 
 
		//如果子条目都没有被复选,则父条目状态应该被修改 
		HTREEITEM htiFather = hItem; 
		while((htiFather = m_TreeCtrl->GetParentItem(htiFather)) != NULL && htiFather != m_TreeCtrl->GetRootItem()) 
		{ 
			BOOL bChildSelected = FALSE; 
			HTREEITEM htiChild = m_TreeCtrl->GetChildItem(htiFather); 
			//检查子条目  
			while(htiChild) 
			{ 
				UINT nChildState = m_TreeCtrl->GetItemState(htiChild , TVIS_STATEIMAGEMASK)>>12; 
 
				if(nChildState != FUNCHECKED && nChildState != CUNCHECKED 
					&& nChildState != NOSTATE)  
				{ 
					bChildSelected = TRUE; 
					break; 
				} 
				htiChild = m_TreeCtrl->GetNextItem(htiChild , TVGN_NEXT); 
			} 
			if(bChildSelected) 
			{ 
				//由于还有其他被复选的子条目,父条目无需更新 
				break; 
			} 
			else 
			{ 
				//由于他它的子条目也没有被复选,父条目需要更新 
				m_TreeCtrl->SetItemState(htiFather,INDEXTOSTATEIMAGEMASK(FUNCHECKED),TVIS_STATEIMAGEMASK); 
				SetNowFlags(htiFather , FUNCHECKED); 
			} 
		} 
	} 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////	 
	else if(nState == CUNCHECKED) 
	{ 
		//如果子条目都没有被复选,则父条目状态应该被修改 
		while((hItem = m_TreeCtrl->GetParentItem(hItem)) != NULL && hItem != m_TreeCtrl->GetRootItem()) 
		{ 
			BOOL bChildSelected = FALSE; 
			HTREEITEM htiChild = m_TreeCtrl->GetChildItem(hItem); 
			//检查子条目  
			while(htiChild) 
			{ 
				UINT nChildState = m_TreeCtrl->GetItemState(htiChild , TVIS_STATEIMAGEMASK)>>12; 
 
				if((nChildState != FUNCHECKED && nChildState != CUNCHECKED ) 
					&& nChildState != NOSTATE) 
				{ 
					bChildSelected = TRUE; 
					break; 
				} 
				htiChild = m_TreeCtrl->GetNextItem(htiChild , TVGN_NEXT); 
			} 
			if(bChildSelected) 
			{ 
				//由于还有其他被复选的子条目,父条目无需更新 
				break; 
			} 
			else 
			{ 
				//由于他它的子条目也没有被复选,父条目需要更新 
				m_TreeCtrl->SetItemState(hItem,INDEXTOSTATEIMAGEMASK(FUNCHECKED),TVIS_STATEIMAGEMASK); 
				SetNowFlags(hItem , FUNCHECKED); 
			} 
		} 
	} 
	    return TRUE; 
} 
 
 
// Updata StateIcon Flags Function 
void CMyTreeView::SetNowFlags(HTREEITEM hItem, UINT nState) 
{ 
	for(int i=0; i<5; i++) 
		if(hItem == htiFChild[i]) 
			Flags_f[i] = nState == FCHECKED ? 2 : 1; 
 
    for(int j = 0;j < 24; j++) 
		if(hItem == htiCChild[j]) 
			Flags_c[j] = nState == CCHECKED ? 1 : 0; 
} 
 
void CMyTreeView::SetStateIcon() 
{ 
	//[图形用户界面开发指南]创建状态图标 
	m_ImageState.Create (IDB_IL_STATE, 16, 1, RGB(255,255,255)); 
	m_TreeCtrl->SetImageList (&m_ImageState, TVSIL_STATE); 
	for(int i=0; i<5; i++) 
		m_TreeCtrl->SetItemState(htiFChild[i],INDEXTOSTATEIMAGEMASK(Flags_f[i]), 
		TVIS_STATEIMAGEMASK); 
 
	for(int j=0 ; j<24 ; j++ ) 
		if(Flags_c[j]) 
			m_TreeCtrl->SetItemState(htiCChild[j],INDEXTOSTATEIMAGEMASK(4), 
			TVIS_STATEIMAGEMASK); 
		else 
			m_TreeCtrl->SetItemState(htiCChild[j],INDEXTOSTATEIMAGEMASK(3), 
			TVIS_STATEIMAGEMASK); 
}