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