www.pudn.com > 球和立方体.rar > OpenGlTreeView.cpp
/*************************************************************************************
*OpenGlTreeView.cpp
***************************************************************************************
*File name:
*OpenGlTreeView.cpp
*Description:
*This module control tree view.
*Revised History:
*1.0 2003.10.18 New Creation
*Designer:
*Tommy.leung
*Execution environment:VC++6.0
*OS:Windows 98
*References:
*
*Copyright(C) 2003 VOYAGER Corporation. All Rights Reserved.
***************************************************************************************/
#include "stdafx.h"
#include "MultiViewsTest.h"
#include "OpenGlTreeView.h"
#include "TreeDialog.h"
#include "MultiViewsTestDoc.h"
#include "MultiViewsTestView.h"
#include "MainFrm.h"
#include "ChildFrm.h"
//#include "MyLink.c"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern GraphNode* glHead;
/////////////////////////////////////////////////////////////////////////////
// OpenGlTreeView
IMPLEMENT_DYNCREATE(OpenGlTreeView, CTreeView)
OpenGlTreeView::OpenGlTreeView()
{
iCNode = 0;
}
OpenGlTreeView::~OpenGlTreeView()
{
}
BEGIN_MESSAGE_MAP(OpenGlTreeView, CTreeView)
//{{AFX_MSG_MAP(OpenGlTreeView)
ON_WM_LBUTTONUP()
ON_EN_CHANGE(IDC_EDIT_SIZE, OnChangeEditSize)
ON_WM_RBUTTONUP()
ON_WM_CREATE()
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// OpenGlTreeView drawing
void OpenGlTreeView::OnDraw(CDC* pDC)
{
// TODO: add draw code here
CDocument* pDoc = GetDocument();
}
///////////////////////////////////////////////////////////////
/*************************************************************************************
*AddNode
**************************************************************************************
*Description:
*This Function control add tree node.
*Argument:
*int i
*Global:
*return:
*Designer:
*Tommy.Leung
*Revised History:
*1.0 2003.10.18 New Creation
**************************************************************************************/
GRAPHDATA* OpenGlTreeView::MyFindNode(GraphNode* head , int iIndex)
{
GraphNode* p;
GRAPHDATA* pData;
p = head;
while(p)
{
pData = (GRAPHDATA*)p->pGraphData;
if( pData->iIndex ==iIndex )
{
return pData;
}
p = p->next;
}
return NULL;
}
//////////////////////////////////////////////////////////////
void OpenGlTreeView::AddNode(int i)
{
CTreeCtrl &TreeCtrl= GetTreeCtrl ();
TV_INSERTSTRUCT tv_is;
HTREEITEM hChild;
GRAPHDATA* pObject;
if( glHead )
{
pObject =(GRAPHDATA*)glHead->pGraphData;
CString s;
tv_is.hParent = hOpenGl_Root;
tv_is.hInsertAfter = TVI_LAST ;
tv_is.item.mask =TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tv_is.item.cchTextMax = 9;
tv_is.item.lParam=1;
s.Format("%d", pObject->iIndex);
tv_is.item.pszText = s.GetBuffer(1);
hChild=TreeCtrl.InsertItem (&tv_is);
}
}
/////////////////////////////////////////////////////////////////////////////
// OpenGlTreeView diagnostics
#ifdef _DEBUG
void OpenGlTreeView::AssertValid() const
{
CTreeView::AssertValid();
}
void OpenGlTreeView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// OpenGlTreeView message handlers
void OpenGlTreeView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
}
/*************************************************************************************
*OnLButtonUp
**************************************************************************************
*Description:
*This Function control mouse left up in tree view.
*Argument:
*UINT nFlags
*CPoint point
*Global:
*return:
*Designer:
*Tommy.Leung
*Revised History:
*1.0 2003.10.18 New Creation
**************************************************************************************/
void OpenGlTreeView::OnLButtonUp(UINT nFlags, CPoint point)
{
CTreeCtrl &TreeCtrl= GetTreeCtrl ();
TV_INSERTSTRUCT tv_is;
HTREEITEM hChild;
GRAPHDATA* pObject;
GraphNode* current;
current = glHead;
if( !TreeCtrl.GetChildItem( hOpenGl_Root) )
{
while( current )
{
CString s;
pObject =(GRAPHDATA*)current->pGraphData;
tv_is.hParent = hOpenGl_Root;
tv_is.hInsertAfter = TVI_LAST ;
tv_is.item.mask =TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tv_is.item.cchTextMax = 9;
tv_is.item.lParam=1;
s.Format("%d", pObject->iIndex);
tv_is.item.pszText = s.GetBuffer(1);
hChild=TreeCtrl.InsertItem (&tv_is);
current= current->next;
}
}
CTreeView::OnLButtonUp(nFlags, point);
}
void OpenGlTreeView::OnChangeEditSize()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CTreeView::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
}
/*************************************************************************************
*OnRBottonUp
**************************************************************************************
*Description:
*This Function control mouse right button and display dialog .
*Argument:
*UINT nFlags
*CPoint point
*Global:
*return:
*Designer:
*Tommy.Leung
*Revised History:
*1.0 2003.10.18 New Creation
**************************************************************************************/
void OpenGlTreeView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CTreeDialog MyDialog;
GRAPHDATA* pObject;
CUBEDATA* pCubeData;
SPHEREDATA* pSphereData;
CMultiViewsTestApp* app=(CMultiViewsTestApp* )AfxGetApp();
CMainFrame* pframe=(CMainFrame*)app->m_pMainWnd;
CChildFrame* pchild=(CChildFrame*)pframe->MDIGetActive();
CMultiViewsTestDoc* pdoc=(CMultiViewsTestDoc*)pchild->GetActiveDocument();
CView* pview;
CMultiViewsTestView *ppview;
POSITION pos=pdoc->GetFirstViewPosition();
while(pos)
{
pview=pdoc->GetNextView(pos);
if(pview->IsKindOf(RUNTIME_CLASS(CMultiViewsTestView)))
break;
}
ppview=(CMultiViewsTestView*)pview;
pObject =MyFindNode(glHead, iCNode);
if(pObject)
{
switch( pObject->iType)
{
case 1:
pCubeData = (CUBEDATA*) pObject;
MyDialog.m_fPositionX = pCubeData->strData.fX;
MyDialog.m_fPositionY = pCubeData->strData.fY;
MyDialog.m_fPositionZ = pCubeData->strData.fZ;
MyDialog.m_fPositionSize = pCubeData->dCubeSize;
break;
case 2:
pSphereData = (SPHEREDATA*) pObject;
MyDialog.m_fPositionX = pSphereData->strData.fX;
MyDialog.m_fPositionY = pSphereData->strData.fY;
MyDialog.m_fPositionZ = pSphereData->strData.fZ;
MyDialog.m_fPositionSize= pSphereData->dSphereRadius;
break;
default:
break;
}
if(MyDialog.DoModal() == IDOK)
{
switch( pObject->iType)
{
case 1:
pCubeData->strData.fX = MyDialog.m_fPositionX;
pCubeData->strData.fY = MyDialog.m_fPositionY;
pCubeData->strData.fZ = MyDialog.m_fPositionZ;
pCubeData->dCubeSize = MyDialog.m_fPositionSize;
break;
case 2:
pSphereData->strData.fX = MyDialog.m_fPositionX;
pSphereData->strData.fY = MyDialog.m_fPositionY;
pSphereData->strData.fZ = MyDialog.m_fPositionZ;
pSphereData->dSphereRadius = MyDialog.m_fPositionSize;
break;
default:
break;
}
}
}
ppview->Invalidate(FALSE);
CTreeView::OnRButtonUp(nFlags, point);
}
/*************************************************************************************
*OnCreat
**************************************************************************************
*Description:
*This Function create tree view.
*Argument:
*LPCREATESTRUCT lpCreateStruct
*Global:
*return:
*Designer:
*Tommy.Leung
*Revised History:
*1.0 2003.10.18 New Creation
**************************************************************************************/
int OpenGlTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;
CTreeCtrl &TreeCtrl= GetTreeCtrl ();
DWORD dwStyle;
dwStyle=GetWindowLong(TreeCtrl.GetSafeHwnd (),GWL_STYLE);
dwStyle|=TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT;
SetWindowLong(TreeCtrl.GetSafeHwnd (),GWL_STYLE,dwStyle);
TreeCtrl.SetBkColor (RGB(245,189,30));
TV_INSERTSTRUCT tv_is;
tv_is.hParent = TVI_ROOT;
tv_is.hInsertAfter = TVI_LAST ;
tv_is.item.mask =TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
CString strSiteText;
strSiteText="MyDraw";
tv_is.item.pszText = strSiteText.GetBuffer(1);
tv_is.item.cchTextMax = strSiteText.GetLength();
tv_is.item.lParam=0;
hOpenGl_Root=TreeCtrl.InsertItem (&tv_is);
return 0;
}
/*************************************************************************************
*OnSelchanged
**************************************************************************************
*Description:
*This Function control tree view change.
*Argument:
*NMHDR* pNMHDR
*LRESULT* pResult
*Global:
*return:
*Designer:
*Tommy.Leung
*Revised History:
*1.0 2003.10.18 New Creation
**************************************************************************************/
void OpenGlTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CTreeCtrl &TreeCtrl = this->GetTreeCtrl();
HTREEITEM hTree = pNMTreeView->itemNew.hItem;
if( !TreeCtrl.GetChildItem( hTree) )
{
CString str;
str = TreeCtrl.GetItemText(hTree);
int i = atoi( str );
CMultiViewsTestApp* app=(CMultiViewsTestApp* )AfxGetApp();
CMainFrame* pframe=(CMainFrame*)app->m_pMainWnd;
CChildFrame* pchild=(CChildFrame*)pframe->MDIGetActive();
CMultiViewsTestDoc* pdoc=(CMultiViewsTestDoc*)pchild->GetActiveDocument();
CView* pview;
CMultiViewsTestView *ppview;
POSITION pos=pdoc->GetFirstViewPosition();
while(pos)
{
pview=pdoc->GetNextView(pos);
if(pview->IsKindOf(RUNTIME_CLASS(CMultiViewsTestView)))
break;
}
ppview=(CMultiViewsTestView*)pview;
ppview->Select(i);
iCNode = i;
}
}