OSG的sample里面有OSG+MFC+MDI的例子。
网上有说OSG+MFCSDI的例子,如http://blog.csdn.net/xuguangsoft/article/details/8164104
这里我说一下怎么在MFC对话框上结合使用OSG。
首先,对话框要保持干净,像酱紫:
然后,在你里osg sample里面找到那个OSG+MFC+MDI的例子(osgviewerMFC),在里面找两个文件:MFC_OSG.h 和 MFC_OSG.cpp。
把这两个文件拷到你自己的对话框项目的源代码目录下,然后在IDE里面添加到项目中。
接下来:
- 在你的 stdafx.h 中添加上 #include<process.h>
- 在你的工程dlg的头文件,比如yourdlg.h中添加 #include "MFC_OSG.h"
- 这个时候你的程序是编译通不过的,会出现好多链接error,是因为没有加OSG库。添加以下的库文件
OpenThreadsd.lib osgd.lib osgDBd.lib osgFXd.lib osgManipulatord.lib osgParticled.lib osgShadowd.lib osgSimd.lib osgTerraind.lib osgTextd.lib osgViewerd.lib osgUtild.lib osgGAd.lib
OpenThreads.lib osg.lib osgDB.lib osgFX.lib osgManipulator.lib osgParticle.lib osgShadow.lib osgSim.lib osgTerrain.lib osgText.lib osgViewer.lib osgUtil.lib osgGA.lib
这个时候再把你的程序改为多字节编码(如果你使用的是unicode编码的话),然后就可以编译运行了。当然,是没什么变化的。
- 在yourdlg.h的类的定义中,添加两个protected属性的变量
cOSG* mOSG;
HANDLE mThreadHandle; - 在类向导中为yourdlg类添加消息响应WM_CREATE的函数OnCreate。
int CyourDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialogEx::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 mOSG = new cOSG(m_hWnd); return 0; }
- 在OnInitialDlg()中添加以下代码,注意这一点与SDI程序不同,SDI程序是要overrideOnInitialUpdate().
mOSG->InitOSG("cow.osg"); mThreadHandle = (HANDLE)_beginthread(&cOSG::Render, 0, mOSG);
- 我不是代码啊、快放我出去呜呜 w_w ●﹏●刚才被困到5后面的代码区了,幸好窝懂点HTML,改了HTML才跑出来。
- 这个时候程序就可以编译运行了,你会看到酱紫的:
- 看到这个运行结果很开心吧,但是呢,为了遵循《程序员的自我修养》,你看看第5步里面用了个new,所以还得delete一下。在类向导里面为yourdlg类添加OnDestory函数
void CyourDlg::OnDestroy() { if(mOSG != NULL) delete mOSG; WaitForSingleObject(mThreadHandle, 1000); CDialogEx::OnDestroy(); // TODO: 在此处添加消息处理程序代码 }