www.pudn.com > mfcopentree.rar > ChildTree.cpp


// ChildTree.cpp : implementation file 
//武汉华中科技大学,2002,(C)版权所有 
//作者:金德才 联系方式:iskyflying@163.com 
//请不要将本软件的任何一部分用于商业用途 
//如果您觉得任何地方有用或者错误,请告诉作者,谢谢! 
//如果你想引用部分源程序,请注明作者信息 
//////////////////////////////////////// 
 
#include "stdafx.h" 
#include "mfcopen.h" 
#include "ChildTree.h" 
#include "newname.h" 
#include "MainFrm.h" 
#include "MfcopenView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CChildTree 
 
CChildTree::CChildTree() 
{ 
	ResetData(); 
} 
 
CChildTree::~CChildTree() 
{ 
	m_imagelist.DeleteImageList(); 
} 
 
 
BEGIN_MESSAGE_MAP(CChildTree, CTreeCtrl) 
	//{{AFX_MSG_MAP(CChildTree) 
	ON_WM_CREATE() 
	ON_WM_CONTEXTMENU() 
	ON_WM_LBUTTONDBLCLK() 
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged) 
	//}}AFX_MSG_MAP 
	ON_MESSAGE(WM_HIGHLIGHT, SetHighLight) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CChildTree message handlers 
 
int CChildTree::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CTreeCtrl::OnCreate(lpCreateStruct) == -1) 
		return -1; 
 
	m_imagelist.Create(IDB_IMAGELIST,13,1,RGB(255,255,255)); 
	SetImageList(&(m_imagelist),TVSIL_STATE); 
 
	AddRoot(); 
	m_nItemSum=0; 
 
	return 0; 
} 
 
 
void CChildTree::AddSTLDentity(CString STLDentityName, CString type) 
{ 
	m_nItemSum++; 
	int count = 0; 
	for(int i=0; i=m_itypenumber) 
	{ 
		//增加类型 
		HTREEITEM temp = InsertItem(type, m_hItemRoot, TVI_LAST); 
		m_hparent[m_itypenumber] = temp; 
		SetItemState(temp,INDEXTOSTATEIMAGEMASK(3),TVIS_STATEIMAGEMASK); 
		m_stype[m_itypenumber] = type; 
		//增加子节点 
		CString str; 
		str.Format("(%d)", m_nItemSum); 
		STLDentityName += str; 
		HTREEITEM tempzi = InsertItem(STLDentityName, temp, TVI_LAST); 
		m_hchild[m_nItemSum-1] = tempzi; 
		m_ichildnumber[m_itypenumber]++;							//名字可以重复 
		m_itypenumber++; 
		SetItemState(tempzi,INDEXTOSTATEIMAGEMASK(11),TVIS_STATEIMAGEMASK); 
		 
	} 
 
} 
 
void CChildTree::DeleteSTLDentity(UINT Index) 
{ 
	if(m_nItemSum<1) 
		return; 
	HTREEITEM hItemDelete=GetSelectedItem();  //获得当前被选中的节点 
	DeleteItem(hItemDelete);                  //删除当前被选中的节点 
    m_nItemSum--; //节点个数减1 
} 
 
 
 
UINT CChildTree::GetSelectItemIndex() 
{ 
	if(m_nItemSum<=0) 
		return 0; 
	else 
	{ 
		UINT Temp; 
		HTREEITEM perticular = GetSelectedItem(); 
		//工作中心被点击 
		if(perticular == m_hItemRoot) 
			return 999; 
		else 
		{ 
			for(int i=0; i0) 
	{ 
		CMenu menuPopup; 
		menuPopup.LoadMenu(IDR_MENUPOPUP); 
		menuPopup.GetSubMenu(1)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,AfxGetMainWnd()); 
	}		 
} 
 
 void CChildTree::OnLButtonDblClk(UINT nFlags, CPoint point)  
 { 
	// TODO: Add your message handler code here and/or call default 
  	HTREEITEM hItemtemp=GetSelectedItem(); 
  	if(hItemtemp == m_hItemRoot) 
  		return; 
 	//修改的信息引起各个类中数据的变化 
 	CMainFrame* pFrame; 
 	pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; 
 	CMfcopenDoc *pdoc = (CMfcopenDoc *)(pFrame->GetActiveDocument()); 
 
  	CString str = GetItemText(GetSelectedItem()); 
	int len = str.GetLength(); 
	int pos = str.Find('('); 
	CString str2; 
	str2 = str.Right(len-pos); 
	str.Delete(pos, len-pos); 
	UINT tt = GetSelectItemIndex(); 
	if(tt >= 999) 
 	{ 
		return; 
 	} 
 
  	CNewName dlg; 
  	dlg.m_newname = str; 
  	if(dlg.DoModal()==IDOK) 
  	{ 
 		str = dlg.m_newname; 
 
 		pdoc->m_savename[tt-1] = str; 
		str += str2; 
 		SetItemText(hItemtemp, str); 
 	} 
	CTreeCtrl::OnLButtonDblClk(nFlags, point); 
} 
 
 
 
void CChildTree::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; 
	// TODO: Add your control notification handler code here 
	CMainFrame* pFrame; 
	pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; 
 	CMfcopenView *pView = (CMfcopenView *)(pFrame->GetActiveView()); 
	int la = GetSelectItemIndex();// 
	if(la<100 && la>0) 
	{ 
		pView->m_iObjectId = la; 
		SetHighLight(la, pView->m_itreeflag); 
		Invalidate(FALSE); 
		pView->Invalidate(FALSE); 
	} 
	*pResult = 0; 
} 
 
void CChildTree::SetHighLight(WPARAM wa, LPARAM la) 
{ 
	//wa:现在所选的;la:上次所选的 
	CMainFrame* pFrame; 
	pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; 
 	CMfcopenView *pView = (CMfcopenView *)(pFrame->GetActiveView()); 
	if(la>0) 
	{ 
		CString str = GetItemText(m_hchild[la-1]);				 
		int len = str.GetLength(); 
		int pos = str.Find(')'); 
		str.Delete(pos+1, len-pos-1); 
		SetItemText(m_hchild[la-1], str); 
		pView->m_itreeflag = 0; 
	} 
	if(wa>0 && wa<999) 
	{ 
		CString str = GetItemText(m_hchild[wa-1]);				 
		CString str2 = "√"; 
		str += str2; 
		SetItemText(m_hchild[wa-1], str); 
		pView->m_itreeflag = wa; 
	} 
	 
} 
 
void CChildTree::ResetData() 
{ 
	for(int i=0; i<100; i++) 
	{ 
		m_ichildnumber[i] = 0; 
		m_hchild[i] = 0; 
	} 
	m_nItemSum = 0; 
	for(i=0; i<100; i++) 
		m_stype[i] = ""; 
	m_itypenumber = 0; 
} 
 
void CChildTree::AddRoot() 
{ 
    TV_INSERTSTRUCT tv_isRoot; 
	CString strTemp; 
	strTemp	= "工作中心"; 
	tv_isRoot.hParent = TVI_ROOT; 
	tv_isRoot.hInsertAfter = TVI_LAST; 
	tv_isRoot.item.mask = TVIF_TEXT|TVIF_STATE; 
	tv_isRoot.item.stateMask = TVIS_STATEIMAGEMASK; 
	tv_isRoot.item.state = INDEXTOSTATEIMAGEMASK(1); 
	tv_isRoot.item.pszText = strTemp.GetBuffer(strTemp.GetLength()); 
	m_hItemRoot = InsertItem(&tv_isRoot); 
	SetItemState( m_hItemRoot, TVIS_BOLD, TVIS_BOLD ); 
	strTemp.ReleaseBuffer();	 
	SetItemState(m_hItemRoot,INDEXTOSTATEIMAGEMASK(1),TVIS_STATEIMAGEMASK);	 
 
}