www.pudn.com > MyMFCVega.rar > MyMFCVegaView.cpp


// MyMFCVegaView.cpp : implementation of the CMyMFCVegaView class 
// 
 
#include "stdafx.h" 
#include "MyMFCVega.h" 
#include "MainFrm.h" 
#include "SetEnvDlg.h" 
 
#include "MyMFCVegaDoc.h" 
#include "MyMFCVegaView.h" 
#include "vg.h" 
#include "vgwin.h" 
#include "vgutil.h"  
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyMFCVegaView 
 
IMPLEMENT_DYNCREATE(CMyMFCVegaView, CView) 
 
BEGIN_MESSAGE_MAP(CMyMFCVegaView, CView) 
	//{{AFX_MSG_MAP(CMyMFCVegaView) 
	ON_WM_SIZE() 
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen) 
	ON_UPDATE_COMMAND_UI(ID_FILE_OPEN, OnUpdateFileOpen) 
	ON_COMMAND(ID_GFX_TEXTURE, OnGfxTexture) 
	ON_UPDATE_COMMAND_UI(ID_GFX_TEXTURE, OnUpdateGfxTexture) 
	ON_COMMAND(ID_GFX_WIREFRAME, OnGfxWireframe) 
	ON_UPDATE_COMMAND_UI(ID_GFX_WIREFRAME, OnUpdateGfxWireframe) 
	ON_COMMAND(ID_GFX_ENV, OnGfxEnv) 
	ON_UPDATE_COMMAND_UI(ID_GFX_ENV, OnUpdateGfxEnv) 
	ON_COMMAND(ID_MOTION_SPIN, OnMotionSpin) 
	ON_UPDATE_COMMAND_UI(ID_MOTION_SPIN, OnUpdateMotionSpin) 
	ON_COMMAND(ID_MOTION_DRIVE, OnMotionDrive) 
	ON_UPDATE_COMMAND_UI(ID_MOTION_DRIVE, OnUpdateMotionDrive) 
	ON_COMMAND(ID_MOTION_UFO, OnMotionUfo) 
	ON_UPDATE_COMMAND_UI(ID_MOTION_UFO, OnUpdateMotionUfo) 
	ON_WM_CHAR() 
	ON_WM_TIMER() 
	//}}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() 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyMFCVegaView construction/destruction 
 
CMyMFCVegaView::CMyMFCVegaView() 
{ 
	// TODO: add construction code here 
	EnableAutomation(); 
	//进行必要的变量初始化 
	vegaInitted=FALSE; 
	vegaDefined=FALSE; 
	vegaConfiged=FALSE; 
	isRunning=FALSE; 
	m_pVegaThread=NULL; 
 
} 
 
CMyMFCVegaView::~CMyMFCVegaView() 
{ 
	stopVega(); 
} 
 
BOOL CMyMFCVegaView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
	//更改默认的窗口样式 
	cs.style |=WS_OVERLAPPED|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_VISIBLE; 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyMFCVegaView drawing 
 
void CMyMFCVegaView::OnDraw(CDC* pDC) 
{ 
	CMyMFCVegaDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
	CRect rcClient; 
	GetClientRect(&rcClient); 
	pDC->FillSolidRect(&rcClient,RGB(0,0,0)); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyMFCVegaView printing 
 
BOOL CMyMFCVegaView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CMyMFCVegaView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CMyMFCVegaView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyMFCVegaView diagnostics 
 
#ifdef _DEBUG 
void CMyMFCVegaView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CMyMFCVegaView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CMyMFCVegaDoc* CMyMFCVegaView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyMFCVegaDoc))); 
	return (CMyMFCVegaDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMyMFCVegaView message handlers 
 
 
 
void CMyMFCVegaView::stopVega() 
{ 
	if(!vegaInitted) 
		return; 
	vgDrawEnabled(1); 
	isRunning=FALSE; 
	while(vegaInitted) 
		Sleep(10); 
} 
 
void CMyMFCVegaView::runVega(void) 
{ 
	isRunning=TRUE; 
	if(m_pVegaThread==NULL) 
	{ 
		m_pVegaThread=AfxBeginThread( 
			(AFX_THREADPROC)runVegaProc,//Vega线程控制函数入口 
			this,                       //传递给控制函数的参数 
			THREAD_PRIORITY_NORMAL,     //设定线程的优先级 
			0,                          //设定堆栈大小与父线程相同 
			0,                          //设定线程创建后立即执行 
			NULL);                      //设定线程的安全属性 
		 
	} 
	while(!getVegaDefined()) 
	{ 
		Sleep(10); 
	} 
 
	win=vgGetWin(0); 
	if(win==NULL) 
	{ 
		vgNotify(VG_FATAL,VG_APP,"ERROR:No Vega window Defined--check %s",getAdfName()); 
		exit(-1); 
	} 
	 
	gfx=vgGetGfx(0); 
	if(gfx==NULL) 
	{ 
		vgNotify(VG_FATAL,VG_APP,"ERROR:No Graphic Status Defined--check %s",getAdfName()); 
		exit(-1); 
	} 
 
	chan=vgGetChan(0); 
	if(chan==NULL) 
	{ 
		vgNotify(VG_FATAL,VG_APP,"ERROR:No Vega Channel Defined--check %s",getAdfName()); 
		exit(-1); 
	} 
 
	obs=vgGetObserv(0); 
	if(obs==NULL) 
	{ 
		vgNotify(VG_FATAL,VG_APP,"ERROR:Couldn't find obs--check %s",getAdfName()); 
		exit(-1); 
	} 
 
	scene=vgGetScene(0); 
	if(scene==NULL) 
	{ 
		vgNotify(VG_FATAL,VG_APP,"ERROR:Couldn't find scene--check %s",getAdfName()); 
		exit(-1); 
	} 
 
    env=vgGetEnv(0); 
	if(env==NULL) 
	{ 
		vgNotify(VG_FATAL,VG_APP,"ERROR:Couldn't find env--check %s",getAdfName()); 
		exit(-1); 
	} 
 
} 
 
BOOL CMyMFCVegaView::getVegaRunning() 
{ 
	return isRunning; 
 
} 
 
BOOL CMyMFCVegaView::getVegaInitted() 
{ 
	return vegaInitted; 
 
} 
 
void CMyMFCVegaView::setVegaInitted(BOOL i) 
{ 
	vegaInitted=i; 
 
} 
 
BOOL CMyMFCVegaView::getVegaDefined() 
{ 
	return vegaDefined; 
 
} 
 
void CMyMFCVegaView::setVegaDefined(BOOL i) 
{ 
	 vegaDefined=i; 
 
} 
 
BOOL CMyMFCVegaView::getVegaConfiged() 
{ 
	return vegaConfiged; 
 
} 
 
void CMyMFCVegaView::setVegaConfiged(BOOL i) 
{ 
	 vegaConfiged=i; 
 
} 
 
void CMyMFCVegaView::postInitted(void) 
{ 
 
} 
 
void CMyMFCVegaView::postDefined(void) 
{ 
	vgWindow* win=vgGetWin(0); 
	vgWinSize(win,0,m_cx,0,m_cy); 
	vgProp(win,VGWIN_WINBORDER,0); 
	vgExitKey(-1); 
} 
 
void CMyMFCVegaView::postConfiged(void) 
{ 
 
} 
 
void CMyMFCVegaView::postSync(void) 
{ 
 
} 
 
void CMyMFCVegaView::postFrame(void) 
{ 
 
} 
 
int CMyMFCVegaView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	if(CView::OnCreate(lpCreateStruct)==-1) 
		return -1; 
	m_pMainFrame=(CMainFrame*)GetParentFrame(); 
	const int TIMER_XYZ=1; 
	SetTimer(TIMER_XYZ,-1,NULL); 
 
	return 0; 
} 
 
void CMyMFCVegaView::toggleGfx(int what) 
{ 
	long i=(long)vgGetProp(gfx,what); 
	if(i) 
		vgProp(gfx,what,VG_OFF); 
	else 
		vgProp(gfx,what,VG_ON); 
} 
 
const char* CMyMFCVegaView::getAdfName() 
{ 
	CMyMFCVegaDoc* doc=(CMyMFCVegaDoc*)GetDocument(); 
	const char* adfName=doc->GetPathName(); 
	if(strlen(adfName)==0) 
		return "vegawin.adf"; 
	else 
		return adfName; 
 
 
} 
 
 
//实现单独的vega线程,线程控制函数  
 
UINT CMyMFCVegaView::runVegaProc(LPVOID pParam) 
{ 
	CMyMFCVegaView *hParent=(CMyMFCVegaView*)pParam; 
	vgInitWinSys(AfxGetInstanceHandle(),hParent->GetSafeHwnd()); 
	hParent->setVegaInitted(TRUE);        //设置vega系统初始化状态 
	hParent->postInitted();               //vega系统初始化后的操作 
 
	vgDefineSys(hParent->getAdfName());    
	hParent->setVegaDefined(TRUE);        //设置vega系统定义的状态  
	hParent->postDefined();               //vega系统定义完成后的操作 
	 
	vgConfigSys(); 
	hParent->setVegaConfiged(TRUE);       //设置vega系统配置的状态 
	hParent->postConfiged();              //vega系统配置完成后的操作 
 
	while(hParent->getVegaRunning()) 
	{ 
		vgSyncFrame(); 
		hParent->postSync();              //vega主循环中帧同步完成后的操作 
		vgFrame(); 
		hParent->postFrame();             //vega主循环中帧渲染完成后的操作 
	} 
 
	hParent->setVegaInitted(FALSE); 
	vgExit(0); 
	return 0; 
 
} 
 
void CMyMFCVegaView::OnSize(UINT nType, int cx, int cy)  
{ 
	CView::OnSize(nType, cx, cy); 
	 
	// TODO: Add your message handler code here 
	m_cx=cx; 
	m_cy=cy; 
	if(!getVegaInitted()) 
		return; 
	vgWinSize(win,0,cx,0,cy); 
	 
} 
 
void CMyMFCVegaView::OnFileOpen()  
{ 
	// TODO: Add your command handler code here 
	CFileDialog fileDlg(TRUE,NULL,NULL, 
		                OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, 
						"Application Define Files(*.adf)|*.adf|", 
						this); 
	if(fileDlg.DoModal()==IDOK) 
	{ 
		CString pathName=fileDlg.GetPathName(); 
		CString fileName=fileDlg.GetFileTitle(); 
		SetWindowText(fileName); 
		GetDocument()->SetPathName(pathName,FALSE); 
		runVega(); 
	} 
	 
} 
 
void CMyMFCVegaView::OnUpdateFileOpen(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	if(getVegaInitted()) 
	pCmdUI->Enable(!getVegaRunning()); 
	 
} 
 
void CMyMFCVegaView::OnGfxTexture()  
{ 
	// TODO: Add your command handler code here 
	toggleGfx(VGGFX_TEXTURE); 
	 
} 
 
void CMyMFCVegaView::OnUpdateGfxTexture(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->Enable(getVegaRunning()); 
	if(getVegaRunning()==TRUE) 
	pCmdUI->SetCheck(vgGetProp(gfx,VGGFX_TEXTURE)); 
	 
} 
 
void CMyMFCVegaView::OnGfxWireframe()  
{ 
	// TODO: Add your command handler code here 
	toggleGfx(VGGFX_WIREFRAME); 
	 
} 
 
void CMyMFCVegaView::OnUpdateGfxWireframe(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->Enable(getVegaRunning()); 
	if(getVegaRunning()==TRUE) 
    pCmdUI->SetCheck(vgGetProp(gfx,VGGFX_WIREFRAME)); 
} 
 
void CMyMFCVegaView::OnGfxEnv()  
{ 
	// TODO: Add your command handler code here 
	CSetEnvDlg* m_pEnvDlg; 
	m_pEnvDlg=new CSetEnvDlg(this); 
	 
} 
 
void CMyMFCVegaView::OnUpdateGfxEnv(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->Enable(getVegaRunning()); 
	 
} 
 
void CMyMFCVegaView::OnMotionSpin()  
{ 
	// TODO: Add your command handler code here 
	vgMotion *mot; 
	mot=vgGetMot(0); 
	vgProp(mot,VGCOMMON_ENABLED,VG_ON); 
	vgProp(mot,VGMOT_MODEL,VGMOT_SPIN); 
	vgProp(obs,VGOBS_TETHERSTATE,VGOBS_DYNAMIC); 
	vgObservMot(obs,mot);	 
 
	 
} 
 
void CMyMFCVegaView::OnUpdateMotionSpin(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->Enable(getVegaRunning()); 
	if(getVegaRunning()==TRUE) 
    pCmdUI->SetCheck(vgGetProp(vgGetMot(0),VGMOT_MODEL)==VGMOT_SPIN); 
	 
} 
 
void CMyMFCVegaView::OnMotionDrive()  
{ 
	// TODO: Add your command handler code here 
	vgMotion *mot; 
	mot=vgGetMot(0); 
	vgProp(mot,VGCOMMON_ENABLED,VG_ON); 
	vgProp(mot,VGMOT_MODEL,VGMOT_DRIVE); 
	vgProp(obs,VGOBS_TETHERSTATE,VGOBS_DYNAMIC); 
	vgObservMot(obs,mot);	 
} 
 
void CMyMFCVegaView::OnUpdateMotionDrive(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->Enable(getVegaRunning()); 
	if(getVegaRunning()==TRUE) 
    pCmdUI->SetCheck(vgGetProp(vgGetMot(0),VGMOT_MODEL)==VGMOT_DRIVE); 
	 
} 
 
void CMyMFCVegaView::OnMotionUfo()  
{ 
	// TODO: Add your command handler code here 
	vgMotion *mot; 
	mot=vgGetMot(0); 
	vgProp(mot,VGCOMMON_ENABLED,VG_ON); 
	vgProp(mot,VGMOT_MODEL,VGMOT_UFO); 
	vgProp(obs,VGOBS_TETHERSTATE,VGOBS_DYNAMIC); 
	vgObservMot(obs,mot); 
} 
 
void CMyMFCVegaView::OnUpdateMotionUfo(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->Enable(getVegaRunning()); 
	if(getVegaRunning()==TRUE) 
	pCmdUI->SetCheck(vgGetProp(vgGetMot(0),VGMOT_MODEL)==VGMOT_UFO); 
	 
} 
 
void CMyMFCVegaView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	// TODO: Add your message handler code here and/or call default 
	if(nChar==VK_ESCAPE) 
	{ 
		//获取主窗口指针 
		m_pMainFrame=(CMainFrame *)this->GetParentFrame(); 
		if(m_pMainFrame->m_bFullScreen) 
			m_pMainFrame->FullScreenOff(); 
	} 
	 
	CView::OnChar(nChar, nRepCnt, nFlags); 
} 
 
void CMyMFCVegaView::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	if(getVegaRunning()==TRUE) 
	{ 
		CString strEyeXYZ; 
		CString strEyeHPR; 
		float x,y,z,h,p,r; 
		vgPosition *pos; 
		pos=vgNewPos(); 
		vgGetPos(obs,pos); 
		vgGetPosVec(pos,&x,&y,&z,&h,&p,&r); 
		strEyeXYZ.Format("(%6.2f,%6.2f,%6.2f)",x,y,z); 
		strEyeHPR.Format("(%5.1f,%5.1f,%5.1f)",h,p,r); 
		m_pMainFrame->SetEyeXYZ(strEyeXYZ); 
		m_pMainFrame->SetEyeHPR(strEyeHPR); 
		vgDelPos(pos); 
	} 
	 
	CView::OnTimer(nIDEvent); 
 
}