www.pudn.com > 球和立方体.rar > MultiViewsTestView.cpp


/************************************************************************************* 
*MultisTestView 
*************************************************************************************** 
*File name: 
*MultiViewsTestView.cpp 
*Description: 
*This module control painting and display. 
*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. 
***************************************************************************************/ 
 
 
// MultiViewsTestView.cpp : implementation of the CMultiViewsTestView class 
// 
 
#include "stdafx.h" 
#include "MultiViewsTest.h" 
#include  
 
 
#include "MultiViewsTestDoc.h" 
#include "MultiViewsTestView.h" 
#include "MyLink.h" 
 
#include "MultiViewsTest.h" 
#include "OpenGlTreeView.h" 
#include "TreeDialog.h" 
#include "MainFrm.h" 
#include "ChildFrm.h" 
 
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
GraphNode* glHead; 
extern "C" GraphNode* GraphAddHead(GraphNode* head , GraphNode* pNewNode); 
////////////////////////////////////// 
// CMultiViewsTestView 
 
IMPLEMENT_DYNCREATE(CMultiViewsTestView, CView) 
 
BEGIN_MESSAGE_MAP(CMultiViewsTestView, CView) 
	//{{AFX_MSG_MAP(CMultiViewsTestView) 
	ON_WM_CREATE() 
	ON_WM_DESTROY() 
	ON_COMMAND(ID_DRAW_CUBE, OnDrawCube) 
	ON_COMMAND(ID_DRAW_SPHERE, OnDrawSphere) 
	ON_COMMAND(ID_MOUSE_CUBE, OnMouseCube) 
	ON_COMMAND(ID_MOUSE_SPHERE, OnMouseSphere) 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	ON_WM_MOUSEMOVE() 
	ON_WM_KEYDOWN() 
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen) 
	ON_COMMAND(ID_FILE_SAVE, OnFileSave) 
	ON_WM_SIZE() 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CMultiViewsTestView construction/destruction 
 
CMultiViewsTestView::CMultiViewsTestView() 
{ 
	// TODO: add construction code here 
	fX=0.0; 
	fY=0.0; 
	fZ=0.0; 
	dRadius=0.5; 
	flag = 0; 
	size = 0.5; 
	glHead = NULL; 
	iSequence = 1; 
	m_drawtype = 0; 
} 
 
CMultiViewsTestView::~CMultiViewsTestView() 
{ 
} 
 
BOOL CMultiViewsTestView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CView::PreCreateWindow(cs); 
} 
 
/////////////////////////////////////////////////////////////////////////////////////// 
// CMultiViewsTestView drawing 
/************************************************************************************* 
*OnDraw 
************************************************************************************** 
*Description: 
*This Function control redraw. 
*Argument: 
*CDC* pDC 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::OnDraw(CDC* pDC) 
{ 
   	 CMultiViewsTestDoc* pDoc = GetDocument(); 
	 ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
	 OnSize(glType, glcx, glcy); 
     GRAPHDATA* pObject; 
     CUBEDATA* pCubeData; 
     SPHEREDATA* pSphereData; 
	 GraphNode* current; 
 
	 wglMakeCurrent(pDC->m_hDC,m_hrc); 
 
	 Init(); 
	 current =glHead; 
	  
	 while(current) 
	 { 
 
	    pObject =  (GRAPHDATA*)current->pGraphData; 
        switch(pObject->iType) 
		{ 
	    case 1: 
		 		    
		 pCubeData = (CUBEDATA*)current->pGraphData; 
			  
    	 DrawCube(pCubeData); 
		 break; 
 
	    case 2: 
	      
	     pSphereData = (SPHEREDATA*)current->pGraphData; 
 
	     DrawSphere(pSphereData); 
		 break; 
 
	    default: 
		 break; 
		} 
	   	 current = current->next; 
	 } 
	 glFlush(); 
	 wglMakeCurrent(pDC->m_hDC,NULL); 
	 SwapBuffers(pDC->m_hDC);	 
 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMultiViewsTestView printing 
/************************************************************************************* 
*OnCreate 
************************************************************************************** 
*Description: 
*This Function control set up windows. 
*Argument: 
*LPCREATESTRUCT lpCreateStruct 
*Global: 
*return: 
*TURE 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
int CMultiViewsTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
 PIXELFORMATDESCRIPTOR pfd={ 
		sizeof(PIXELFORMATDESCRIPTOR), 
			1, 
			PFD_DRAW_TO_WINDOW| 
			PFD_SUPPORT_OPENGL| 
			PFD_DOUBLEBUFFER, 
			PFD_TYPE_RGBA, 
			24, 
			0,0,0,0,0,0, 
			0, 
			0, 
			0, 
			0,0,0,0, 
			32, 
			0, 
			0, 
			PFD_MAIN_PLANE, 
			0, 
			0,0,0 
	}; 
 
//	OnCreate(pWnd,&pfd); 
 
	m_pdc=new CClientDC(this); //构造CDC对象 
 
	int nPixelFormat=ChoosePixelFormat(m_pdc->m_hDC,&pfd); //选择像素格式 
 
	if (nPixelFormat==0) 
	{ 
		return FALSE; 
	} 
 
	if (!SetPixelFormat(m_pdc->m_hDC,nPixelFormat,&pfd)) 
	{ //设置像素格式 
		int i; 
		AfxMessageBox ("设置像素失败! "); 
        i = GetLastError(); 
		return FALSE; 
 
	} 
 
	m_hrc=wglCreateContext(m_pdc->m_hDC); //创建RC 
	 
 
	if (!m_hrc) 
	{ 
 
		AfxMessageBox ("产生设备描述表失败!"); 
 
		return FALSE; 
 
	} 
 
	return TRUE; 
} 
BOOL CMultiViewsTestView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CMultiViewsTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CMultiViewsTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMultiViewsTestView diagnostics 
 
#ifdef _DEBUG 
void CMultiViewsTestView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CMultiViewsTestView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CMultiViewsTestDoc* CMultiViewsTestView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMultiViewsTestDoc))); 
	return (CMultiViewsTestDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMultiViewsTestView message handlers 
/************************************************************************************* 
*OnDestroy 
************************************************************************************** 
*Description: 
*This Function control destroy windows. 
*Argument: 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::OnDestroy()  
{ 
	CView::OnDestroy(); 
	 
	// TODO: Add your message handler code here 
	if (m_hrc) 
	{ 
 
		if (m_hrc==::wglGetCurrentContext()) 
 
		::wglMakeCurrent(NULL,NULL); 
 
		::wglDeleteContext(m_hrc); //释放当前RC 
 
		m_hrc=NULL; 
 
	} 
 
	if (m_pdc) 
	{ 
 
	delete m_pdc; //释放DC句柄`` 
 
	m_pdc=NULL; 
 
	} 
	 
} 
/************************************************************************************* 
*OnDrawCube 
************************************************************************************** 
*Description: 
*This Function control botton draw cube. 
*Argument: 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::OnDrawCube()  
{ 
	// TODO: Add your command handler code here 
	int f; 
	f = 1; 
    dRadius += 0.1; 
	CUBEDATA* strCubeData = new CUBEDATA; 
	strCubeData->dCubeSize = dRadius; 
	strCubeData->strData.iType= 1; 
	strCubeData->strData.fX = 0; 
	strCubeData->strData.fY = 0; 
	strCubeData->strData.fZ = 0; 
 
    strCubeData->strData.iIndex = iSequence++; 
	strCubeData->strData.iSelect = 0; 
 
	GraphNode* strNewNode = new GraphNode; 
    strNewNode->pGraphData = (char *) strCubeData; 
	strNewNode->next = NULL; 
	glHead = GraphAddHead(glHead, strNewNode); 
    size += 0.1; 
	SetFlag(f); 
	Invalidate(FALSE);	 
 
	CMultiViewsTestDoc* pDoc = GetDocument(); 
 
	CMultiViewsTestApp* app=(CMultiViewsTestApp* )AfxGetApp(); 
    CMainFrame*   pframe=(CMainFrame*)app->m_pMainWnd; 
    CChildFrame*  pchild=(CChildFrame*)pframe->MDIGetActive(); 
    CMultiViewsTestDoc* pdoc=(CMultiViewsTestDoc*)pchild->GetActiveDocument(); 
 
    CView* pview; 
    OpenGlTreeView *ppview; 
    POSITION pos=pdoc->GetFirstViewPosition(); 
	  while(pos) 
	{ 
	  pview=pdoc->GetNextView(pos); 
	  if(pview->IsKindOf(RUNTIME_CLASS(OpenGlTreeView))) 
		  break; 
	} 
    ppview=(OpenGlTreeView*)pview; 
	ppview->AddNode(f); 
} 
/************************************************************************************* 
*OnDrawSphere 
************************************************************************************** 
*Description: 
*This Function control botton draw sphere 
*Argument: 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::OnDrawSphere()  
{ 
	// TODO: Add your command handler code here 
    int f; 
	f = 2; 
	dRadius += 0.1; 
	SPHEREDATA* strSphereData = new SPHEREDATA; 
	strSphereData->dSphereRadius = dRadius; 
	strSphereData->strData.iType= 2; 
	strSphereData->strData.fX = 0; 
	strSphereData->strData.fY = 0; 
	strSphereData->strData.fZ = 0; 
 
	strSphereData->strData.iIndex = iSequence++; 
	strSphereData->strData.iSelect = 0; 
 
	GraphNode* strNewNode = new GraphNode; 
	strNewNode->pGraphData = (char *) strSphereData; 
	strNewNode->next = NULL; 
	glHead = GraphAddHead(glHead, strNewNode); 
	size += 0.1;    
    SetFlag(f);     
    DrawSphere(strSphereData); 
	Invalidate(FALSE);	 
	CMultiViewsTestDoc* pDoc = GetDocument(); 
 
	CMultiViewsTestApp* app=(CMultiViewsTestApp* )AfxGetApp(); 
    CMainFrame*   pframe=(CMainFrame*)app->m_pMainWnd; 
    CChildFrame*  pchild=(CChildFrame*)pframe->MDIGetActive(); 
    CMultiViewsTestDoc* pdoc=(CMultiViewsTestDoc*)pchild->GetActiveDocument(); 
 
    CView* pview; 
    OpenGlTreeView *ppview; 
    POSITION pos=pdoc->GetFirstViewPosition(); 
	  while(pos) 
	{ 
	  pview=pdoc->GetNextView(pos); 
	  if(pview->IsKindOf(RUNTIME_CLASS(OpenGlTreeView))) 
		  break; 
	} 
    ppview=(OpenGlTreeView*)pview; 
	ppview->AddNode(f); 
} 
/************************************************************************************* 
*MakeCurrent 
************************************************************************************** 
*Description: 
*This Function control receive RC. 
*Argument: 
*Global: 
*return: 
*0 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::MakeCurrent() 
 
{ 
	ASSERT(m_hrc); 
	if (m_hrc!=wglGetCurrentContext()) 
	{ 
		if (!wglMakeCurrent(m_pdc->m_hDC,m_hrc)) 
		{ //使成为当前调用线程的RC 
			AfxMessageBox("使成为当前RC失败!"); 
			return ; 
		} 
	} 
} 
/************************************************************************************* 
*Init 
************************************************************************************** 
*Description: 
*This Function initialization windows. 
*Argument: 
*void 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::Init(void) 
 
{ 
	glClearColor(0.0,0.0,0.0,1.0);		 
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);	 
	glShadeModel(GL_SMOOTH); 
	 
	// 设置混色函数取得半透明效果 
	glBlendFunc(GL_SRC_ALPHA,GL_ONE); 	 
	glEnable(GL_BLEND);  
	 
	//平滑线条 
    glEnable (GL_LINE_SMOOTH); 
    glEnable (GL_BLEND); 
 
// 真正精细的透视修正 
    glHint (GL_POLYGON_SMOOTH_HINT|GL_LINE_SMOOTH_HINT, GL_NICEST); 
	 
	//充许深度测试 
	glEnable(GL_DEPTH_TEST); 
	glDepthFunc(GL_LEQUAL); 
 
	glMatrixMode(GL_PROJECTION); 
} 
/************************************************************************************* 
*SteFlag 
************************************************************************************** 
*Description: 
*This Function receive flag. 
*Argument: 
*int f  
*int flag  
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::SetFlag(int f) 
{ 
	flag = f; 
} 
/************************************************************************************* 
*OnMouseCube 
************************************************************************************** 
*Description: 
*This Function control mouse draw cube. 
*Argument: 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::OnMouseCube()  
{ 
	// TODO: Add your command handler code here		 
	CMDIFrameWnd *pFrame =  
             (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd; 
	CToolBar *pToolBar = (CToolBar *)(pFrame 
		->GetControlBar(AFX_IDW_TOOLBAR)); 
	CToolBarCtrl *pToolBarCtrl = &(pToolBar->GetToolBarCtrl()); 
 
	if( (m_drawtype ==0) ) 
	{ 
		m_drawtype = 1; 
		pToolBarCtrl->SetState(ID_MOUSE_CUBE,true); 
	} 
	else 
	{  
		if(m_drawtype ==1) 
		{ 
			pToolBarCtrl->SetState(ID_MOUSE_CUBE,false); 
			m_drawtype= 0; 
		} 
		else 
		{ 
			m_drawtype = 1; 
			pToolBarCtrl->SetState(ID_MOUSE_CUBE,true); 
			pToolBarCtrl->SetState(ID_MOUSE_SPHERE,false); 
		} 
	} 
 
} 
/************************************************************************************* 
*OnMouseSphere 
************************************************************************************** 
*Description: 
*This Function control mouse draw sphere. 
*Argument: 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::OnMouseSphere()  
{ 
	// TODO: Add your command handler code here 
 
	CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd; 
	CToolBar *pToolBar = (CToolBar *)(pFrame->GetControlBar(AFX_IDW_TOOLBAR)); 
	CToolBarCtrl *pToolBarCtrl = &(pToolBar->GetToolBarCtrl()); 
	if( (m_drawtype ==0) ) 
	{ 
		m_drawtype = 2; 
		pToolBarCtrl->SetState(ID_MOUSE_SPHERE,true); 
	} 
	else 
	{  
		if(m_drawtype ==2) 
		{ 
			pToolBarCtrl->SetState(ID_MOUSE_SPHERE,false); 
			m_drawtype = 0; 
		} 
		else 
		{ 
			m_drawtype = 2; 
			pToolBarCtrl->SetState(ID_MOUSE_SPHERE,true); 
			pToolBarCtrl->SetState(ID_MOUSE_CUBE,false); 
		} 
	} 
	 
} 
/************************************************************************************* 
*OnLButtonDown 
************************************************************************************** 
*Description: 
*This Function control mouse left button down. 
*Argument: 
*UINT nFlags  
*CPoint point  
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	SetCapture(); 
	CClientDC ClientDC (this); 
    m_glPoint.x = point.x; 
	m_glPoint.y = point.y; 
	CView::OnLButtonDown(nFlags, point); 
} 
/************************************************************************************* 
*OnLButtonUp 
************************************************************************************** 
*Description: 
*This Function control mouse right button up. 
*Argument: 
*UINT nFlags  
*CPoint point  
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	ReleaseCapture(); 
	CClientDC ClientDC (this); 
 
	double dDistance; 
	float  fX, fY, fEX, fEY; 
	fX = (float)(10.6/glcx * m_glPoint.x) - 5.3; 
	fY = (float) 2.8 - 5.4/glcy * m_glPoint.y; 
	fEX = (float)(10.6/glcx * point.x) - 5.3; 
	fEY = (float) 2.8 - 5.4/glcy * point.y; 
	dDistance = (fX - fEX) * (fX - fEX); 
	dDistance += (fY - fEY) * (fY - fEY); 
	dDistance = sqrt(dDistance); 
	 
 
	GRAPHDATA* pObject; 
    CUBEDATA* pCubeData; 
    SPHEREDATA* pSphereData; 
	GraphNode* pNewNode; 
 
	CMultiViewsTestApp* app=(CMultiViewsTestApp* )AfxGetApp(); 
    CMainFrame*   pframe=(CMainFrame*)app->m_pMainWnd; 
    CChildFrame*  pchild=(CChildFrame*)pframe->MDIGetActive(); 
    CMultiViewsTestDoc* pdoc=(CMultiViewsTestDoc*)pchild->GetActiveDocument(); 
 
    CView* pview; 
    OpenGlTreeView *ppview; 
    POSITION pos=pdoc->GetFirstViewPosition(); 
	  while(pos) 
	{ 
	  pview=pdoc->GetNextView(pos); 
	  if(pview->IsKindOf(RUNTIME_CLASS(OpenGlTreeView))) 
		  break; 
	} 
    ppview=(OpenGlTreeView*)pview; 
	switch(m_drawtype) 
	{ 
	case 1: 
		pCubeData = new CUBEDATA; 
		pCubeData->strData.fX = fX; 
		pCubeData->strData.fY = fY; 
		pCubeData->strData.fZ = 0; 
		pCubeData->strData.iType = 1; 
		pCubeData->strData.iIndex = iSequence++; 
		pCubeData->strData.iSelect = 0; 
		pCubeData->dCubeSize = dDistance; 
		pNewNode = new GraphNode; 
		pNewNode->pGraphData = (char *) pCubeData; 
		pNewNode->next = NULL; 
		glHead = GraphAddHead(glHead, pNewNode); 
		break; 
 
    case 2: 
		pSphereData = new SPHEREDATA; 
		pSphereData->strData.fX = fX; 
		pSphereData->strData.fY = fY; 
		pSphereData->strData.fZ = 0; 
		pSphereData->strData.iType = 2; 
		pSphereData->strData.iIndex = iSequence++; 
		pSphereData->strData.iSelect = 0; 
		pSphereData->dSphereRadius = dDistance; 
		pNewNode = new GraphNode; 
		pNewNode->pGraphData = (char *) pSphereData; 
		pNewNode->next = NULL; 
		glHead = GraphAddHead(glHead, pNewNode); 
		break; 
 
	default: 
		break; 
	} 
	if(m_drawtype>0) 
        ppview->AddNode(m_drawtype); 
	    CView::OnLButtonUp(nFlags, point); 
	    Invalidate(FALSE);	 
} 
 
void CMultiViewsTestView::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
 
	CView::OnMouseMove(nFlags, point); 
} 
/************************************************************************************* 
*OnKeyDown 
************************************************************************************** 
*Description: 
*This Function control keyborad. 
*Argument: 
*UINT nChar  
*UINT nRepCnt  
*UINT nFlags  
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	// TODO: Add your message handler code here and/or call default 
		switch(nChar) 
		{ 
		case VK_LEFT: 
			MoveLeft(glHead); 
			break; 
		case VK_RIGHT: 
			MoveRight(glHead); 
			break; 
		case VK_UP: 
		    MoveUp(glHead); 
			break; 
		case VK_DOWN: 
			MoveDown(glHead); 
			break;	 
		case VK_F2: 
		    ChangeBig (glHead); 
		    break; 
        case VK_F1: 
	        ChangeSmall (glHead); 
		    break; 
		case VK_F3: 
		    MoveInside(glHead); 
		    break; 
        case VK_F4: 
	        MoveOut(glHead); 
		    break; 
        default: 
			break; 
		} 
	CView::OnKeyDown(nChar, nRepCnt, nFlags); 
	Invalidate(FALSE);	 
} 
/************************************************************************************* 
*OnFileOpen 
************************************************************************************** 
*Description: 
*This Function control file open. 
*Argument: 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::OnFileOpen()  
{ 
	// TODO: Add your command handler code here 
	CFileDialog mFileDlg(true, NULL, NULL, 
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT,  
		"All Files (*.*)|*.*| |", AfxGetMainWnd()); 
 
	if ( (mFileDlg.DoModal() ) == IDOK) 
	{	 
		 SPHEREDATA* strSphereData; 
		 GRAPHDATA pObject; 
 
		 CUBEDATA*  strCubeData; 
		 CString csFilePath; 
		 long int  currentsize; 
		 long int filesize;  
		 GLFILEHEAD strGLFileHead; 
	     FILE *fp; 
		  
		 csFilePath = mFileDlg.GetPathName(); 
         fp=fopen(csFilePath, "rb"); 
 
		 fread(&strGLFileHead, sizeof(GLFILEHEAD), 1, fp); 
		 currentsize = sizeof(GLFILEHEAD); 
		 filesize = strGLFileHead.wLength; 
		 GraphNode* strNewNode; 
 
		while(currentsize < filesize) 
		{ 
            fseek(fp ,currentsize, SEEK_SET);  
			fread( &pObject, sizeof(GRAPHDATA), 1, fp); 
			switch(pObject.iType) 
			{ 
			case 1: 
				fseek(fp ,currentsize, SEEK_SET); 
				strCubeData = new CUBEDATA; 
				fread(strCubeData,sizeof(CUBEDATA), 1, fp); 
                 
				strNewNode = new GraphNode; 
				strNewNode->pGraphData = (char *) strCubeData; 
				strNewNode->next = NULL; 
				glHead = GraphAddHead(glHead, strNewNode); 
 
				currentsize += sizeof(CUBEDATA); 
				break; 
	 
			case 2: 
			 
		    	fseek(fp ,currentsize, SEEK_SET); 
				strSphereData = new SPHEREDATA; 
				fread(strSphereData,sizeof(SPHEREDATA), 1, fp); 
 
                strNewNode = new GraphNode; 
				strNewNode->pGraphData = (char *) strSphereData; 
				strNewNode->next = NULL; 
				glHead = GraphAddHead(glHead, strNewNode); 
 
				currentsize += sizeof(SPHEREDATA); 
			     
 
				break; 
 
			default: 
				break; 
			} 
 
		} 
		fclose(fp); 
	} 
		Invalidate(FALSE);	 
} 
/************************************************************************************* 
*OnFileSave 
************************************************************************************** 
*Description: 
*This Function control file save. 
*Argument: 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::OnFileSave()  
{ 
	// TODO: Add your command handler code here 
	CFileDialog mFileDlg(false, NULL, NULL, 
	OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT,  
	"All Files (*.*)|*.*| |", AfxGetMainWnd()); 
	if ( (mFileDlg.DoModal()) == IDOK ) 
	{ 
		 
		 GRAPHDATA* pObject; 
		 CString csFilePath; 
		 GraphNode* current; 
		 long int filesize; 
	   	 FILE *fp;  
 
		csFilePath = mFileDlg.GetPathName(); 
		fp=fopen(csFilePath, "wb");  
		GLFILEHEAD* pGLFileHead = new GLFILEHEAD; 
        
		fseek (fp, sizeof(GLFILEHEAD), SEEK_SET); 
		filesize = sizeof(GLFILEHEAD); 
		current = glHead; 
		while(current) 
		{ 
 
			pObject =  (GRAPHDATA*)current->pGraphData; 
			switch(pObject->iType) 
			{ 
			case 1: 
                fseek (fp, filesize, SEEK_SET); 
				fwrite(current->pGraphData, 
					sizeof(CUBEDATA), 1, fp); 
				filesize += sizeof(CUBEDATA); 
				break; 
	 
			case 2: 
				fseek (fp, filesize, SEEK_SET); 
				fwrite(current->pGraphData, 
					sizeof(SPHEREDATA), 1, fp); 
				filesize += sizeof(SPHEREDATA); 
				break; 
 
			default: 
				break; 
			} 
	   	 current = current->next; 
		} 
		pGLFileHead->wLength = filesize; 
      	fseek (fp, 0, SEEK_SET); 
		fwrite(pGLFileHead,sizeof(GLFILEHEAD), 1, fp); 
	    fclose(fp);	 
	} 
} 
/************************************************************************************* 
*DrawSphere 
************************************************************************************** 
*Description: 
*This Function control draw sphere. 
*Argument: 
*SPHEREDATA* strSphereData  
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::DrawSphere(SPHEREDATA* strSphereData) 
{ 
         
	if(strSphereData->strData.iSelect == 1) 
		glColor3f(1., 0., 1.); 
	else 
		glColor3f(0., 1, 0.); 
		glPushMatrix(); 
		glTranslatef(strSphereData->strData.fX, 
		strSphereData->strData.fY, strSphereData->strData.fZ); 
	    GLUquadricObj* q = gluNewQuadric(); 
    	gluQuadricDrawStyle(q, GLU_LINE); 
    	gluSphere(q, strSphereData->dSphereRadius, 16, 16); 
	    gluDeleteQuadric(q); 
		glPopMatrix(); 
} 
/************************************************************************************* 
*DrawCube 
************************************************************************************** 
*Description: 
*This Function control draw cube. 
*Argument: 
*CUBEDATA* strCubeData 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::DrawCube(CUBEDATA* strCubeData)	 
{ 
	if(strCubeData->strData.iSelect == 1) 
  		glColor3f(1., 0., 1.); 
	else 
		glColor3f(0., 1., 0.); 
		glPushMatrix(); 
		glTranslatef(strCubeData->strData.fX, 
			         strCubeData->strData.fY,  
					 strCubeData->strData.fZ); 
	    MyDrawWireCube (strCubeData->dCubeSize); 
		glPopMatrix(); 
} 
/************************************************************************************* 
*OnSize 
************************************************************************************** 
*Description: 
*This Function control windows size. 
*Argument: 
*UINT nType  
*int vcx  
*int vcy  
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::OnSize(UINT nType, int vcx, int vcy)  
{ 
	CView::OnSize(nType, vcx, vcy); 
	 
	// TODO: Add your message handler code here 
	glcx = vcx; 
	glcy = vcy; 
	GLsizei w=vcx; 
    GLsizei h=vcy; 
   // int f; 
	//avoid divided by zero 
	if(!h)return; 
	//make it the calling thread's current rendering context 
	wglMakeCurrent(m_pdc->m_hDC,m_hrc); 
	//define the viewport 
	glViewport(0,0,w,h); 
	//prepare for and then 
	glMatrixMode(GL_PROJECTION); 
	//define the projecton transformation 
	glLoadIdentity(); 
	gluPerspective(60.,(GLfloat)w/(GLfloat)h,1.,20.); 
	//back to modeview matrix 
	glMatrixMode(GL_MODELVIEW); 
	glLoadIdentity(); 
	glTranslatef(0.,0.,-5.); 
 
	 
} 
/************************************************************************************* 
*MoveDown 
************************************************************************************** 
*Description: 
*This Function control graph move down. 
*Argument: 
*GraphNode* glCurrent 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::MoveDown(GraphNode* glCurrent) 
{ 
   GRAPHDATA* pObject; 
   CUBEDATA* pCubeData; 
   SPHEREDATA* pSphereData; 
   pObject =  (GRAPHDATA*) glCurrent->pGraphData; 
   switch(pObject->iType) 
   { 
   case 1: 
	    
	   pCubeData = (CUBEDATA*) glCurrent->pGraphData; 
	   pCubeData->strData.fY -= 0.1; 
	   break; 
 
   case 2: 
	   pSphereData = (SPHEREDATA*) glCurrent->pGraphData; 
	   pSphereData->strData.fY -= 0.1; 
	   break; 
 
   default: 
	   break; 
   } 
} 
/************************************************************************************* 
*MoveUp 
************************************************************************************** 
*Description: 
*This Function control graph move up. 
*Argument: 
*GraphNode* glCurrent 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::MoveUp(GraphNode* glCurrent) 
{ 
   GRAPHDATA* pObject; 
   CUBEDATA* pCubeData; 
   SPHEREDATA* pSphereData; 
   pObject =  (GRAPHDATA*) glCurrent->pGraphData; 
   switch(pObject->iType) 
   { 
   case 1: 
	    
	   pCubeData = (CUBEDATA*) glCurrent->pGraphData; 
	   pCubeData->strData.fY += 0.1; 
	   break; 
 
   case 2: 
	   pSphereData = (SPHEREDATA*) glCurrent->pGraphData; 
	   pSphereData->strData.fY += 0.1; 
	   break; 
 
   default: 
	   break; 
   } 
} 
//////////////////////////////////////////////////////// 
/************************************************************************************* 
*MoveInside 
************************************************************************************** 
*Description: 
*This Function control graph move inside. 
*Argument: 
*SPHEREDATA* strSphereData  
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::MoveInside(GraphNode* glCurrent) 
{   
   GRAPHDATA* pObject; 
   CUBEDATA* pCubeData; 
   SPHEREDATA* pSphereData; 
   pObject = (GRAPHDATA*) glCurrent->pGraphData; 
   switch(pObject->iType) 
   { 
   case 1: 
	    
	   pCubeData = (CUBEDATA*) glCurrent->pGraphData; 
	   pCubeData->strData.fZ += 0.1; 
	   break; 
 
   case 2: 
	   pSphereData = (SPHEREDATA*) glCurrent->pGraphData; 
	   pSphereData->strData.fZ += 0.1; 
	   break; 
 
   default: 
	   break; 
   } 
} 
/////////////////////////////////////////////////////// 
/************************************************************************************* 
*MoveOut 
************************************************************************************** 
*Description: 
*This Function control graph move out. 
*Argument: 
*graphNode* glCurrent 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::MoveOut(GraphNode* glCurrent) 
{ 
   GRAPHDATA* pObject; 
   CUBEDATA* pCubeData; 
   SPHEREDATA* pSphereData; 
   pObject =  (GRAPHDATA*) glCurrent->pGraphData; 
   switch(pObject->iType) 
   { 
   case 1: 
	    
	   pCubeData = (CUBEDATA*) glCurrent->pGraphData; 
	   pCubeData->strData.fZ -= 0.1; 
	   break; 
 
   case 2: 
	   pSphereData = (SPHEREDATA*) glCurrent->pGraphData; 
	   pSphereData->strData.fZ -= 0.1; 
	   break; 
 
   default: 
	   break; 
   } 
} 
//////////////////////////////////////////////// 
/************************************************************************************* 
*ChangeBig 
************************************************************************************** 
*Description: 
*This Function control graph change big. 
*Argument: 
*GraphNode* glCurrent  
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::ChangeBig(GraphNode* glCurrent) 
{ 
   GRAPHDATA* pObject; 
   CUBEDATA* pCubeData; 
   SPHEREDATA* pSphereData; 
   pObject =  (GRAPHDATA*) glCurrent->pGraphData; 
   switch(pObject->iType) 
   { 
   case 1: 
	    
	   pCubeData = (CUBEDATA*) glCurrent->pGraphData; 
	   pCubeData->dCubeSize += 0.1; 
	   break; 
 
   case 2: 
	   pSphereData = (SPHEREDATA*) glCurrent->pGraphData; 
	   pSphereData->dSphereRadius += 0.1; 
	   break; 
 
   default: 
	   break; 
   } 
	 
} 
///////////////////////////////////////////////////////////// 
/************************************************************************************* 
*ChangeSmall 
************************************************************************************** 
*Description: 
*This Function control graph change small. 
*Argument: 
*GraphNode* glCurrent  
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::ChangeSmall(GraphNode* glCurrent) 
{ 
   GRAPHDATA* pObject; 
   CUBEDATA* pCubeData; 
   SPHEREDATA* pSphereData; 
 
   pObject =  (GRAPHDATA*) glCurrent->pGraphData; 
   switch(pObject->iType) 
   { 
   case 1: 
	    
	   pCubeData = (CUBEDATA*) glCurrent->pGraphData; 
	   pCubeData->dCubeSize -= 0.1; 
	   break; 
 
   case 2: 
	   pSphereData = (SPHEREDATA*) glCurrent->pGraphData; 
	   pSphereData->dSphereRadius -= 0.1; 
	   break; 
 
   default: 
	   break; 
   } 
} 
/************************************************************************************* 
*MoveLeft 
************************************************************************************** 
*Description: 
*This Function control graph move left. 
*Argument: 
*GraphNode* glCurrent  
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::MoveLeft (GraphNode* glCurrent) 
{ 
   GRAPHDATA* pObject; 
   CUBEDATA* pCubeData; 
   SPHEREDATA* pSphereData; 
   pObject =  (GRAPHDATA*) glCurrent->pGraphData; 
   switch(pObject->iType) 
   { 
   case 1: 
	    
	   pCubeData = (CUBEDATA*) glCurrent->pGraphData; 
	   pCubeData->strData.fX -= 0.1; 
	   break; 
 
   case 2: 
	   pSphereData = (SPHEREDATA*) glCurrent->pGraphData; 
	   pSphereData->strData.fX -= 0.1; 
	   break; 
 
   default: 
	   break; 
   } 
} 
 
//////////////////////////////////////////////// 
/************************************************************************************* 
*MoveRight 
************************************************************************************** 
*Description: 
*This Function control graph move right. 
*Argument: 
*GraphNode* glCurrent  
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::MoveRight (GraphNode* glCurrent) 
{ 
   GRAPHDATA* pObject; 
   CUBEDATA* pCubeData; 
   SPHEREDATA* pSphereData; 
   pObject =  (GRAPHDATA*) glCurrent->pGraphData; 
   switch(pObject->iType) 
   { 
   case 1: 
	    
	   pCubeData = (CUBEDATA*) glCurrent->pGraphData; 
	   pCubeData->strData.fX += 0.1; 
	   break; 
 
   case 2: 
	   pSphereData = (SPHEREDATA*) glCurrent->pGraphData; 
	   pSphereData->strData.fX += 0.1; 
	   break; 
 
   default: 
	   break; 
   } 
} 
 
/************************************************************************************* 
*Select 
************************************************************************************** 
*Description: 
*This Function control graph index number choose. 
*Argument: 
*int i 
*Global: 
*return: 
*Designer: 
*Tommy.Leung 
*Revised History: 
*1.0 2003.10.18 New Creation 
**************************************************************************************/ 
void CMultiViewsTestView::Select(int i) 
{ 
	GraphNode* p; 
	p = glHead; 
	GRAPHDATA* pObject; 
 
 
	while (p!=NULL) 
	{ 
		pObject =  (GRAPHDATA*) p->pGraphData; 
		if(pObject->iIndex == iCurrent) 
		{ 
			pObject->iSelect = 0; 
            break; 
		} 
        p=p->next; 
	} 
	    p = glHead; 
   
	while (p!=NULL) 
	{ 
		pObject =  (GRAPHDATA*) p->pGraphData; 
		if(pObject->iIndex == i) 
		{ 
			pObject->iSelect = 1; 
            break; 
		} 
        p=p->next; 
	} 
    iCurrent = i; 
    Invalidate(FALSE);	 
} 
void CMultiViewsTestView::MyDrawWireCube(const float fWidth) 
{ 
	glBegin(GL_LINE_LOOP); 
		glVertex3f(fWidth/2,fWidth/2,fWidth/2); 
		glVertex3f(-fWidth/2,fWidth/2,fWidth/2); 
		glVertex3f(-fWidth/2,-fWidth/2,fWidth/2); 
		glVertex3f(fWidth/2,-fWidth/2,fWidth/2); 
	glEnd(); 
 
	glBegin(GL_LINE_LOOP); 
		glVertex3f(fWidth/2,fWidth/2,-fWidth/2); 
		glVertex3f(-fWidth/2,fWidth/2,-fWidth/2); 
		glVertex3f(-fWidth/2,-fWidth/2,-fWidth/2); 
		glVertex3f(fWidth/2,-fWidth/2,-fWidth/2); 
	glEnd(); 
 
	glBegin(GL_LINES); 
		glVertex3f(fWidth/2,fWidth/2,-fWidth/2); 
		glVertex3f(fWidth/2,fWidth/2,fWidth/2); 
 
		glVertex3f(-fWidth/2,fWidth/2,-fWidth/2); 
		glVertex3f(-fWidth/2,fWidth/2,fWidth/2); 
 
		glVertex3f(-fWidth/2,-fWidth/2,-fWidth/2); 
		glVertex3f(-fWidth/2,-fWidth/2,fWidth/2); 
 
		glVertex3f(fWidth/2,-fWidth/2,-fWidth/2); 
		glVertex3f(fWidth/2,-fWidth/2,fWidth/2); 
	glEnd(); 
}