MFC加载osg模型

创建MFC单文档项目,

OSGObject.h

#pragma once
#include <osgViewer\Viewer>
#include <osgDB\ReadFile>
#include <osgViewer\api\Win32\GraphicsWindowWin32>
#include <osgGA\TrackballManipulator>

#include <osg\Group>

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 <osgViewer\Viewer>
#include <osgDB\ReadFile>
#include <osgViewer\api\Win32\GraphicsWindowWin32>
#include <osgGA\TrackballManipulator>

#include <osg\Group>

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

}

 

posted @ 2019-09-01 17:56  西北逍遥  阅读(829)  评论(0编辑  收藏  举报