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