虽然有这个例子,但是还会有些问题,现总结一下,和小白们共勉
环境:
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