osg MFC 读取文件显示 的例子osgviewerMFC

虽然有这个例子,但是还会有些问题,现总结一下,和小白们共勉

环境:

VS2010 +  OSG 3.0.0

 首先在osg文件夹下的example下面找到osgviewerMFC,可以看到里面都是源文件形式,并没有建立MFC工程。所以打开vs2010,新建一个空白工程(empty project): expMFC,然后菜单project-> add existing item,将这些源文件都选择并添加进去。然后可以看到工程将这些类添加了进来。 


注意有关osg的方法声明和实现在MFC_OSG.h和MFC_OSG.cpp的cOSG类中。(如果自己建立复杂的根节点之类的也在这里实现结构组织,见void cOSG::InitSceneGraph(void)方法中的建立组节点)


可以查看下其他各个类的内容,因为这个工程中使用osg只涉及到显示,因此可以看到只在view类中包含MFC_OSG.h。 


实现在窗口中osg显示模式,主要是在view类中的Oncreate消息响应函数和重写虚函数OnInitialUpdate中实现的。

OnCreate只是产生VIEW的基本结构和变量是一个消息响应函数,而在OnInitialUpDate()中,主要初始化视图中控件等,对各个变量进行初始化操作。有关这方面的更多信息可以参照这里:http://blog.sina.com.cn/s/blog_95c7062e01010skx.html

来看下OnCreate():在MFC创建视图窗口消息正确时,定义一个cOSG对象,利用构造函数将窗口的句柄初始化给该对象mOSG.

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

看下OnInitialUpdate的重写:

void CMFC_OSG_MDIView::OnInitialUpdate()
{
    CView::OnInitialUpdate();

    // Get Filename from DocumentOpen Dialog
    CString csFileName = GetDocument()->GetFileName();
// 	string str;

    // Init the osg class
    mOSG->InitOSG(csFileName.GetString()); // 可能提示类型转换错误,设置为多字节(UseMulti-Byte Character Set

    // Start the thread to do OSG Rendering
    mThreadHandle = (HANDLE)_beginthread(&cOSG::Render, 0, mOSG); 
}

编译运行后,打开cow.osg,显示如下:

PS:

编译可能提示的类型转换错误,改为多字节。

编译可能提示的LINK error:LNK1561: entry point must be defined,解决方法:在ProjectProperties->Linker->System中的subsystem设置为:/subsystem:windows



猜你喜欢

转载自blog.csdn.net/foreverhehe716/article/details/45220905