www.pudn.com > CurveEditor.rar > ObjectsTree.cpp


// ObjectsTree.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "CurveEditor.h" 
#include "ObjectsTree.h" 
#include "CurveEditorDoc.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CObjectsTree 
 
IMPLEMENT_DYNCREATE(CObjectsTree, CTreeView) 
 
CObjectsTree::CObjectsTree() 
{ 
} 
 
CObjectsTree::~CObjectsTree() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CObjectsTree, CTreeView) 
	//{{AFX_MSG_MAP(CObjectsTree) 
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged) 
	ON_MESSAGE(CEV_NOTIFY_MESSAGE, OnCurveEditorViewNotify) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CObjectsTree drawing 
 
void CObjectsTree::OnDraw(CDC* pDC) 
{ 
	CDocument* pDoc = GetDocument(); 
	// TODO: add draw code here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CObjectsTree diagnostics 
 
#ifdef _DEBUG 
void CObjectsTree::AssertValid() const 
{ 
	CTreeView::AssertValid(); 
} 
 
void CObjectsTree::Dump(CDumpContext& dc) const 
{ 
	CTreeView::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CObjectsTree message handlers 
 
void CObjectsTree::OnInitialUpdate()  
{ 
	CTreeView::OnInitialUpdate(); 
 
//	CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); 
	 
	int i, count, nCurveNum; 
	POSITION position, posOld; 
	VECTOR vector; 
	CString str; 
	HTREEITEM hItem, hItemPoint; 
	CTreeCtrl& tree=GetTreeCtrl(); 
	CCurveEditorDoc* pDoc = (CCurveEditorDoc*)GetDocument(); 
//	pDoc->m_pObjectsTreeView = this; 
//	pDoc->m_hWndObjects = GetSafeHwnd(); 
	ASSERT_VALID(pDoc); 
 
	for(nCurveNum=0; nCurveNum<2; nCurveNum++) 
	{ 
		str.Format("Curve %d", nCurveNum+1); 
		m_ahItemCurve[nCurveNum] = hItem = tree.InsertItem(str); 
		count = pDoc->m_alstCtrlPoint[nCurveNum].GetCount(); 
		position = pDoc->m_alstCtrlPoint[nCurveNum].GetHeadPosition(); 
		for(i=0; im_alstCtrlPoint[nCurveNum].GetNext(position); 
			str.Format("(%7.4f, %7.4f, %7.4f)", vector.x, vector.y, vector.z); 
			hItemPoint = tree.InsertItem(str, hItem); 
			tree.SetItemData(hItemPoint, (DWORD)posOld); 
		} 
 
		tree.Expand(m_ahItemCurve[nCurveNum], TVE_EXPAND); 
	} 
} 
 
void CObjectsTree::Entry() 
{ 
	MessageBox("CObjectsTree -- Entry"); 
} 
 
void CObjectsTree::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)  
{ 
} 
 
BOOL CObjectsTree::PreCreateWindow(CREATESTRUCT& cs)  
{ 
	cs.style |= TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_SHOWSELALWAYS; 
	return CTreeView::PreCreateWindow(cs); 
} 
 
void CObjectsTree::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	CCurveEditorDoc* pDoc = (CCurveEditorDoc*)GetDocument(); 
	ASSERT_VALID(pDoc); 
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; 
	CTreeCtrl& tree = GetTreeCtrl(); 
	HTREEITEM hItem; 
 
	DWORD dwData = tree.GetItemData(pNMTreeView->itemNew.hItem); 
	hItem = dwData==0?pNMTreeView->itemNew.hItem : tree.GetParentItem(pNMTreeView->itemNew.hItem); 
	pDoc->m_nCurrentCurve = (hItem == m_ahItemCurve[0])? 0 : 1; 
	*pResult = 0; 
} 
 
LONG CObjectsTree::OnCurveEditorViewNotify(WPARAM wParam, LPARAM lParam) 
{ 
	int i, j, count; 
	HTREEITEM hItem, hItemOld; 
	CTreeCtrl& tree = GetTreeCtrl(); 
	CString str; 
	CCurveEditorDoc* pDoc = (CCurveEditorDoc*)GetDocument(); 
	CList *pvCtrlPoint; 
	VECTOR	vector; 
	POINTCHANGED *ppc = (POINTCHANGED*)lParam;	// a structure for pass data 
	POSITION posTree, position, posOld; 
 
	switch(wParam) 
	{ 
	case CEVN_UPDATE_CURVE: 
		/* one or more contorl points of Bezier curves had been changed, 
			the tree view need updating. */ 
		pvCtrlPoint = &(pDoc->m_alstCtrlPoint[ppc->nCurveNum]); 
		vector = pvCtrlPoint->GetAt(ppc->position); 
		hItem = tree.GetChildItem(m_ahItemCurve[ppc->nCurveNum]); 
		posTree = (POSITION)tree.GetItemData(hItem); 
		while(posTree != ppc->position && hItem) 
		{ 
			hItem = tree.GetNextSiblingItem(hItem); 
			posTree = (POSITION)tree.GetItemData(hItem); 
		} 
		 
		if(posTree == ppc->position) 
		{ 
			str.Format("(%7.4f, %7.4f, %7.4f)", vector.x, vector.y, vector.z); 
			tree.SetItemText(hItem, str); 
		} 
		break; 
	case CEVN_CTRL_POINT_INCREASED: 
		/* one control point has been add, update the tree view. */ 
		CWnd::SetRedraw(false); 
		pvCtrlPoint = &(pDoc->m_alstCtrlPoint[lParam]); 
		position = pvCtrlPoint->GetHeadPosition(); 
		hItem = tree.GetChildItem(m_ahItemCurve[lParam]); 
		count = pvCtrlPoint->GetCount(); 
		for(i=0; iGetNext(position); 
			str.Format("(%7.4f, %7.4f, %7.4f)", vector.x, vector.y, vector.z); 
			tree.SetItemText(hItem, str); 
			hItem = tree.GetNextSiblingItem(hItem); 
		} 
		vector = pvCtrlPoint->GetAt(position); 
		str.Format("(%7.4f, %7.4f, %7.4f)", vector.x, vector.y, vector.z); 
		hItem = tree.InsertItem(str, m_ahItemCurve[lParam]); 
		tree.SetItemData(hItem, (DWORD)position); 
 
		CWnd::SetRedraw(); 
		Invalidate(false); 
		break; 
	case CEVN_NEW_CURVE: 
		/* New curve(s) generated, all data in the doc had been changed, 
			we should update thoroughly. */ 
		CWnd::SetRedraw(false); 
		for(i=0; i<2; i++) 
		{ 
			pvCtrlPoint = pDoc->m_alstCtrlPoint; 
			hItem = tree.GetChildItem(m_ahItemCurve[i]); 
			count = pvCtrlPoint[i].GetCount(); 
			position = pvCtrlPoint[i].GetHeadPosition(); 
			for(j=0; j