虽然有这个例子,但是还会有些问题,现总结一下,和小白们共勉
环境:
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); }
PS:
编译可能提示的类型转换错误,改为多字节。
编译可能提示的LINK error:LNK1561: entry point must be defined,解决方法:在ProjectProperties->Linker->System中的subsystem设置为:/subsystem:windows