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; i++)
{
//已存在的类型,只是增加其子节点
if(type == m_stype[i])
{
CString str;
str.Format("(%d)", m_nItemSum);
STLDentityName += str;
HTREEITEM tempzi2 = InsertItem(STLDentityName, m_hparent[i], TVI_LAST);
m_hchild[m_ichildnumber[i]] = tempzi2;
SetItemState(tempzi2,INDEXTOSTATEIMAGEMASK(11),TVIS_STATEIMAGEMASK);
m_ichildnumber[i]++;
return;
}
else
count++;
}
//新增的类型,增加类型及其子节点
if(count>=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; i<m_itypenumber; i++)
{
//类型被点击
if(perticular == m_hparent[i])
{
return (1000+i);
}
}
//类型的子节点被点击
HTREEITEM tempparent = GetParentItem(perticular);
for(i=0; i<m_itypenumber; i++)
{
if(tempparent == m_hparent[i])
{
//找到是此类型中的第几个子节点
HTREEITEM hItem=GetNextItem(tempparent,TVGN_NEXTVISIBLE);
HTREEITEM hItemTemp;
Temp =1;
for(; hItem!=GetSelectedItem();Temp++)
{
hItemTemp=GetNextItem(hItem,TVGN_NEXT);
hItem=hItemTemp;
}
//计算是所有子节点中的第几个子节点,代表是第几个实体
for(int j=0; j<i; j++)
{
Temp += m_ichildnumber[j];
}
return Temp;
}
}
}
}
return 0;
}
void CChildTree::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
if(m_nItemSum>0)
{
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);
}