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