OpenSceneGraph/examples/osgviewerMFC/MFC_OSG_MDIView.cpp
Robert Osfield fee5bc9f8c From Michael Hartman, "Here is an update for the closing issue with the example osgviewerMFC where the MFC rendering thread would not exit before the application and the thread would be left running in the background and the user would have to use TaskManager to kill the process.
Changes:

MFC_OSG.cpp:

            Removed pixelformatdesciptor from the class initialization.

            Used setInheritedWindowPixelFormat to true so it will setup the pixelformat for the window.

            Added class destructor code.

MFC_OSG.h:

            Removed the ref_ptr on osgViewer::Viewer

MFC_OSG_MDIViewer.cpp:

            Changed the OnDestroy function code.

            Added WaitforSingleObject with thread handle for the MFC render handle.

MFC_OSG_MDIView.h:

            Added class variable for MFC Render Thread Handle for use with the WaitforSingleObject.
"
2007-07-23 20:37:49 +00:00

110 lines
2.1 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()
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()
{
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);
}
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);
}
}