创建MFC单文档项目,
OSGObject.h
#pragma once #include <osgViewerViewer> #include <osgDBReadFile> #include <osgViewerapiWin32GraphicsWindowWin32> #include <osgGATrackballManipulator> #include <osgGroup> class COSGObject { public: COSGObject(HWND hWnd); ~COSGObject(); void InitOSG(); void InitSceneGraph(); void InitCameraConfig(); void PreFrameUpdate(); void PostFrameUpdate(); static void Render(void* ptr); osgViewer::Viewer* getOsgViewer(); private: HWND m_hwnd; osgViewer::Viewer* mViewer; osg::ref_ptr<osg::Group> mRoot; };
OSGObject.cpp
#pragma once #include <osgViewerViewer> #include <osgDBReadFile> #include <osgViewerapiWin32GraphicsWindowWin32> #include <osgGATrackballManipulator> #include <osgGroup> class COSGObject { public: COSGObject(HWND hWnd); ~COSGObject(); void InitOSG(); void InitSceneGraph(); void InitCameraConfig(); void PreFrameUpdate(); void PostFrameUpdate(); static void Render(void* ptr); osgViewer::Viewer* getOsgViewer(); private: HWND m_hwnd; osgViewer::Viewer* mViewer; osg::ref_ptr<osg::Group> mRoot; };
View.h
// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 // (“Fluent UI”)。该示例仅供参考, // 用以补充《Microsoft 基础类参考》和 // MFC C++ 库软件随附的相关电子文档。 // 复制、使用或分发 Fluent UI 的许可条款是单独提供的。 // 若要了解有关 Fluent UI 许可计划的详细信息,请访问 // http://go.microsoft.com/fwlink/?LinkId=238214。 // // 版权所有(C) Microsoft Corporation // 保留所有权利。 // View.h : View 类的接口 // #pragma once #include "Doc.h" #include "OSGObject.h" class View : public CView { protected: // 仅从序列化创建 CMFC_OsgEarth20190901View(); DECLARE_DYNCREATE(View) // 特性 public: Doc* GetDocument() const; // 操作 public: COSGObject* mOsgObj; HANDLE mThreadHandle; // 重写 public: virtual void OnDraw(CDC* pDC); // 重写以绘制该视图 virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: // 实现 public: virtual ~View(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // 生成的消息映射函数 protected: afx_msg void OnFilePrintPreview(); afx_msg void OnRButtonUp(UINT nFlags, CPoint point); afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); DECLARE_MESSAGE_MAP() public: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnDestroy(); virtual void OnInitialUpdate(); }; #ifndef _DEBUG // View.cpp 中的调试版本 inline Doc* View::GetDocument() const { return reinterpret_cast<Doc*>(m_pDocument); } #endif
View.cpp
// 这段 MFC 示例源代码演示如何使用 MFC Microsoft Office Fluent 用户界面 // (“Fluent UI”)。该示例仅供参考, // 用以补充《Microsoft 基础类参考》和 // MFC C++ 库软件随附的相关电子文档。 // 复制、使用或分发 Fluent UI 的许可条款是单独提供的。 // 若要了解有关 Fluent UI 许可计划的详细信息,请访问 // http://go.microsoft.com/fwlink/?LinkId=238214。 // // 版权所有(C) Microsoft Corporation // 保留所有权利。 // View.cpp : View 类的实现 // #include "stdafx.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #endif #include "Doc.h" #include "View.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // View IMPLEMENT_DYNCREATE(View, CView) BEGIN_MESSAGE_MAP(View, CView) ON_WM_CONTEXTMENU() ON_WM_RBUTTONUP() ON_WM_CREATE() ON_WM_ERASEBKGND() ON_WM_DESTROY() END_MESSAGE_MAP() // View 构造/析构 View::View() { // TODO: 在此处添加构造代码 mOsgObj = 0; mThreadHandle = 0; } View::~View() { } BOOL View::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 return CView::PreCreateWindow(cs); } // View 绘制 void View::OnDraw(CDC* /*pDC*/) { Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 } void View::OnRButtonUp(UINT /* nFlags */, CPoint point) { ClientToScreen(&point); OnContextMenu(this, point); } void View::OnContextMenu(CWnd* /* pWnd */, CPoint point) { #ifndef SHARED_HANDLERS //theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); #endif } // View 诊断 #ifdef _DEBUG void View::AssertValid() const { CView::AssertValid(); } void View::Dump(CDumpContext& dc) const { CView::Dump(dc); } Doc* View::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(Doc))); return (Doc*)m_pDocument; } #endif //_DEBUG // View 消息处理程序 int View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 mOsgObj = new COSGObject(m_hWnd); return 0; } BOOL View::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (0 == mOsgObj) { return CView::OnEraseBkgnd(pDC); } else { return FALSE; } return CView::OnEraseBkgnd(pDC); } void View::OnDestroy() { CView::OnDestroy(); // TODO: 在此处添加消息处理程序代码 if (mOsgObj != 0) { delete mOsgObj; } WaitForSingleObject(mThreadHandle, 1000); } void View::OnInitialUpdate() { CView::OnInitialUpdate(); // TODO: 在此添加专用代码和/或调用基类 mOsgObj->InitOSG(); mThreadHandle = (HANDLE)_beginthread(&COSGObject::Render, 0, mOsgObj); }