|
example目录下有个叫osgviewerMFC的示例程序,我想仿造它在MFC中使用OSG,但运行时会在这个地方出错:
// Add the Camera to the Viewer
mViewer->addSlave(camera.get());
跟踪调试的时候发现,执行到这里的时候就出问题了:
// Create the Graphics Context
osg::GraphicsContext* gc = osg::GraphicsContext::createGraphicsContext(traits.get());//gc的地址一直为空,看来是createGraphicsContext方法没有成功调用。
还望各位大侠帮忙解决啊,全部代码已经通过附件上传了。
顺便说一下我怎么成功在MFC中运行OSG的示例的(我用的是VC2005SP1+OSG2.4+Platform SDK2003):
1。新建一个MDI工程,名字一定要叫MFC_OSG_MDI(我也不知道为什么,反正叫别的名字就会出现上面的问题),其它的一切按默认设置就可以了;
2。在CMFC_OSG_MDIDoc的类声明中加入:
CString m_csFileName;
CString GetFileName() const { return m_csFileName; }
然后再用向导为CMFC_OSG_MDIDoc添加OnOpenDocument这个虚函数,在函数中加入这一句:
m_csFileName = lpszPathName;
3。在CMFC_OSG_MDIApp类的InitInstance函数中加入一下代码,目的是为了程序开始时不打开新文档:
// 分析标准外壳命令、DDE、打开文件操作的命令行
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if(cmdInfo.m_nShellCommand==CCommandLineInfo::FileNew) //加上这两句
cmdInfo.m_nShellCommand=CCommandLineInfo::FileNothing;
4.将.....OSG目录\example\osgViewer下的MFC_OSG.h和MFC_OSG.cpp两个文件拷贝到工程目录下,再把这两个文件添加到工程中。
5.先在CMFC_OSG_MDIView类的声明中添加cOSG* mOSG和HANDLE mThreadHandle, 然后再用向导添加OnCreate消息映射和OnInitialUpdate虚函数,并按如下方式添加代码:
int CMFC_OSG_MDIView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
// Now that the window is created setup OSG
mOSG = new cOSG(m_hWnd);
return 0;
}
void CMFC_OSG_MDIView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
// Get Filename from DocumentOpen Dialog
CString csFileName = GetDocument()->GetFileName();
USES_CONVERSION;
std::string s = T2A(csFileName.GetBuffer());
mOSG->InitOSG(s);
// Start the thread to do OSG Rendering
mThreadHandle = (HANDLE)_beginthread(&cOSG::Render, 0, mOSG);
}
6.在stdafx.h中添加#include <process.h>
这样就可以编译运行了,附件中MFC_OSG_MDI可以直接正常运行,而test18基本上也是仿造这个来的,但就是会出错,大家一起帮看看问题出在哪呀~~~ |
|