查看: 3804|回复: 6

MFC中使用OSG的问题

[复制链接]

该用户从未签到

发表于 2008-8-15 16:38:12 | 显示全部楼层 |阅读模式
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基本上也是仿造这个来的,但就是会出错,大家一起帮看看问题出在哪呀~~~

MFC_OSG_MDI.rar

111.79 KB, 下载次数: 351, 下载积分: 威望 1

该用户从未签到

发表于 2008-8-15 20:53:27 | 显示全部楼层
经测试,两个程序都可以在我的系统上运行。
不知道test18和osgviewerMFC之间的主要区别是哪里?您有修改什么地方吗?

如果您希望详细了解一下createGraphicsContext的调用机制,可以参看我正在编写的教程《最长的一帧》,这几天的内容将针对OSG图形上下文与Win32 API的关系做出论述~~(就算打广告吧,反正我是版主

该用户从未签到

 楼主| 发表于 2008-8-18 09:42:57 | 显示全部楼层
晕,两个程序在你电脑上都能正常运行?难道是我电脑出问题了?test18和osgviewerMFC基本上没有区别,但test18在我电脑上就是运行不了,调用osg::GraphicsContext::createGraphicsContext就是获取不到指针,郁闷……

该用户从未签到

发表于 2008-8-19 20:36:35 | 显示全部楼层
VS2005sp1打了吗?否则会出一些问题。

该用户从未签到

发表于 2008-8-19 20:45:59 | 显示全部楼层
MFC下的OSG程序在DEBUG下,关闭程序有内存泄漏现象。  array知道什么原因吗?

该用户从未签到

发表于 2008-8-19 22:14:43 | 显示全部楼层
原帖由 blindpoint 于 2008-8-19 20:45 发表
MFC下的OSG程序在DEBUG下,关闭程序有内存泄漏现象。  array知道什么原因吗?


教程版里曾经有个贴子介绍过这个问题,不过说实话我没有试验过,我几乎不用MFC的
http://bbs.osgchina.org/viewthread.php?tid=317

该用户从未签到

 楼主| 发表于 2008-8-20 12:33:51 | 显示全部楼层
原帖由 donghua 于 2008-8-19 20:36 发表
VS2005sp1打了吗?否则会出一些问题。

打过了,VC2005SP1+OSG2.4+Platform SDK2003
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表