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