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);
}