OpenSceneGraph/examples/osgviewerMFC/MFC_OSG_MDIView.cpp
Robert Osfield 5162fcc108 From Wang Rui, "I've encountered a strange problem that osgviewerMFC doesn't work well
with the StatsHandler. When the 's' key is pressed, the rendering
window will be halted. I tried solving the problem by commenting a
line in CMFC_OSG_MDIView::OnKeyDown() and it seems to work now.

Another improvement here is to use a thread class derived from
OpenThreads to replace the old _beginthread(). It helps a lot in
keeping a high frame rate when you open more than one MDI child
windows. And the application using OpenThreads in my opinion will be
more compatible and portable."
2011-09-12 10:47:59 +00:00

120 lines
2.4 KiB
C++

// MFC_OSG_MDIView.cpp : implementation of the CMFC_OSG_MDIView class
//
#include "stdafx.h"
#include "MFC_OSG_MDI.h"
#include "MFC_OSG_MDIDoc.h"
#include "MFC_OSG_MDIView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNCREATE(CMFC_OSG_MDIView, CView)
BEGIN_MESSAGE_MAP(CMFC_OSG_MDIView, CView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_KEYDOWN()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
CMFC_OSG_MDIView::CMFC_OSG_MDIView() :
mOSG(0L)
{
}
CMFC_OSG_MDIView::~CMFC_OSG_MDIView()
{
}
BOOL CMFC_OSG_MDIView::PreCreateWindow(CREATESTRUCT& cs)
{
return CView::PreCreateWindow(cs);
}
void CMFC_OSG_MDIView::OnDraw(CDC* /*pDC*/)
{
CMFC_OSG_MDIDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
}
#ifdef _DEBUG
void CMFC_OSG_MDIView::AssertValid() const
{
CView::AssertValid();
}
void CMFC_OSG_MDIView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMFC_OSG_MDIDoc* CMFC_OSG_MDIView::GetDocument() const // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFC_OSG_MDIDoc)));
return (CMFC_OSG_MDIDoc*)m_pDocument;
}
#endif //_DEBUG
int CMFC_OSG_MDIView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// Let MFC create the window before OSG
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// Now that the window is created setup OSG
mOSG = new cOSG(m_hWnd);
return 1;
}
void CMFC_OSG_MDIView::OnDestroy()
{
delete mThreadHandle;
if(mOSG != 0) delete mOSG;
//WaitForSingleObject(mThreadHandle, 1000);
CView::OnDestroy();
}
void CMFC_OSG_MDIView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// Get Filename from DocumentOpen Dialog
CString csFileName = GetDocument()->GetFileName();
// Init the osg class
mOSG->InitOSG(csFileName.GetString());
// Start the thread to do OSG Rendering
//mThreadHandle = (HANDLE)_beginthread(&cOSG::Render, 0, mOSG);
mThreadHandle = new CRenderingThread(mOSG);
mThreadHandle->start();
}
void CMFC_OSG_MDIView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// Pass Key Presses into OSG
//mOSG->getViewer()->getEventQueue()->keyPress(nChar);
// Close Window on Escape Key
if(nChar == VK_ESCAPE)
{
GetParent()->SendMessage(WM_CLOSE);
}
}
BOOL CMFC_OSG_MDIView::OnEraseBkgnd(CDC* pDC)
{
/* Do nothing, to avoid flashing on MSW */
return true;
}