查看: 4715|回复: 18

怎样在对话框应用程序上显示osg图像

[复制链接]

该用户从未签到

发表于 2008-5-22 15:39:32 | 显示全部楼层 |阅读模式
e:\main.bmp请问各位高手,我建立一个对话框应用程序,在对话框上放置一个静态文本控件,我想在这个静态文本里显示一个osg图像“cow.osg”
静态文本的ID号为IDC_STATICDISPLAY;在对话框初始化的时候加载initosg();我用下面的代码它的
图像不显示在指定的静态文本里,而是单独的开了一个窗口显示这只可爱的蒙牛!为什么?
我是仿照《OSG 窗口与网页浏览器的嵌合》 本文作者:array   校对整理:FlySky写的,不知道那儿仿错了
请高手帮我分析分析并,在下感激不尽!编译环境VS2005 sp1 Chs ,osg2.4

static void RenderThread(void* ptr);
void CCNC3DMonitorDlg::initosg(void)
{
        CRect rc;
        GetDlgItem(IDC_STATICDISPLAY)->GetClientRect(&rc);
        CWnd *wnd=GetDlgItem(IDC_STATICDISPLAY);
        m_Viewer=new osgViewer::Viewer;
        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
        osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(wnd->m_hWnd);       
        traits->x = 0;
        traits->y = 0;
        traits->width = rc.right - rc.left;
        traits->height = rc.bottom - rc.top        ;
        traits->windowDecoration = false;
        traits->doubleBuffer = true;
        traits->sharedContext = 0;
        traits->inheritedWindowData = windata;
        osg::ref_ptr<osg::GraphicsContext> gc=osg::GraphicsContext::createGraphicsContext(traits.get());
        osg::ref_ptr<osg::Camera> camera=new osg::Camera;
        camera->setGraphicsContext(gc.get());       
        camera->setViewport(new osg::Viewport(traits->x,traits->y,traits->width,traits->height));
        camera->setProjectionMatrixAsPerspective( 30.0f,
                (double)traits->width/(double)traits->height, 1.0f, 10000.0f );
        //camera->setDrawBuffer(GL_BACK);
        //camera->setReadBuffer(GL_BACK);
        m_Viewer->setThreadingModel(osgViewer::Viewer::SingleThreaded);
        m_Viewer->setCameraManipulator(new osgGA::TrackballManipulator);
        m_Root = new osg::Group;
        //m_Viewer->getCamera()->setClearColor(osg::Vec4(0.8,0.8,0.8,1));
        //m_Viewer->addSlave(camera.get());
        m_Viewer->setSceneData(osgDB::readNodeFile("cow.osg"));
        m_Viewer->realize();
        _beginthread(&RenderThread,0,m_Viewer);
}
void RenderThread(void* ptr)
{       
        osgViewer::Viewer* viewer = (osgViewer::Viewer*)ptr;
        while( !viewer->done() )
        {
                viewer->frame();
        }
        _endthread();               
}

void CCNC3DMonitorDlg::OnDestroy()
{
        m_Viewer->setDone(true);
        Sleep(200);
        m_Viewer->stopThreading();
        delete m_Viewer;
        CDialog::OnDestroy();       
}

该用户从未签到

 楼主| 发表于 2008-5-22 15:46:28 | 显示全部楼层

想要显示的位置是:

对话框图
main.jpg

该用户从未签到

发表于 2008-5-22 19:11:00 | 显示全部楼层
osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(wnd->m_hWnd);


确认一下这里面的窗口句柄wnd->m_hWnd是否是正确的,可以参照osgviewerMFC的做法

该用户从未签到

 楼主| 发表于 2008-5-22 20:22:20 | 显示全部楼层
谢谢array
//   IDC_STATICDISPLAY是静态文本的ID这种写法有问题吗?
CWnd *wnd=GetDlgItem(IDC_STATICDISPLAY);
osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(wnd->m_hWnd);
在一个静态文本的窗口里显示还真有点麻烦
我都搞了好几天了,就是搞不定

该用户从未签到

发表于 2008-5-22 22:58:49 | 显示全部楼层
原帖由 wu_java 于 2008-5-22 20:22 发表
谢谢array
//   IDC_STATICDISPLAY是静态文本的ID这种写法有问题吗?
CWnd *wnd=GetDlgItem(IDC_STATICDISPLAY);
osg::ref_ptr windata = new osgViewer::GraphicsWindowWin32::WindowData(wnd->m_hWnd);
在一 ...


这种ID的写法应该不会有问题,可以试一试直接把整个窗口的句柄赋给OSG的WindowData类。我不确定是否可以把OSG嵌合在MFC的某个控件上,也许压根就不可以也说不定~~
我个人对MFC是深恶痛绝的(而是疯狂推崇Qt),所以从来不怎么研究OSG+MFC的问题,呵呵,不知其他朋友有没有好的意见~~

该用户从未签到

 楼主| 发表于 2008-5-23 18:09:19 | 显示全部楼层
array
今天我成功的把osgViewer嵌合在MFC的Static text控件上;
但问题也来了,用鼠标在上面拖动时,图形不会动
Qt这个工具我没有用过;不知好用不好用?

该用户从未签到

发表于 2008-5-23 18:54:43 | 显示全部楼层
原帖由 wu_java 于 2008-5-23 18:09 发表
array
今天我成功的把osgViewer嵌合在MFC的Static text控件上;
但问题也来了,用鼠标在上面拖动时,图形不会动
Qt这个工具我没有用过;不知好用不好用?


没有在KeyDown事件的处理函数中把数据传递给OSG吧?参看osgviewerMFC例子,KeyDown函数中
mOSG->getViewer()->getEventQueue()->keyPress(...);
mOSG->getViewer()->getEventQueue()->mouseButtonPress(...);

Qt是世界上最好的跨平台C++图形库之一~~MFC只能用在Windows平台的,而且个人觉得封装的不是很好

该用户从未签到

 楼主| 发表于 2008-5-24 06:32:50 | 显示全部楼层
昨夜折腾了一宿
还是没有折腾出Qt怎么使用
呵呵……

该用户从未签到

 楼主| 发表于 2008-5-24 09:16:00 | 显示全部楼层
Qt只是设计用户界面吗?
那它与那种C++编译器配合使用比较好
这下让我入门两个好东东
osg & Qt

该用户从未签到

发表于 2008-5-24 14:11:01 | 显示全部楼层
原帖由 wu_java 于 2008-5-24 09:16 发表
Qt只是设计用户界面吗?
那它与那种C++编译器配合使用比较好
这下让我入门两个好东东
osg & Qt


都没有问题,MSVC,minGW,g++。
不过学习还是需要一段过程的,遇到困难的时候不要轻言放弃就好~~

该用户从未签到

 楼主| 发表于 2008-5-24 18:45:26 | 显示全部楼层
谢谢array的鼓励
我是做工控的,看到新技术就想把它用到工业控制上,
今天我在公司捣鼓了一天Qt & minGW把头都搞大了,总算弄出我的第一个Qt小程式
MFC在我的脑中影响太深,现在弄起Qt看来我得转换思维,明天弄弄Qt&MSVC
看看那种更适合我

该用户从未签到

发表于 2010-10-22 17:18:38 | 显示全部楼层
请问一下,怎么让对话框里的“蒙牛”动地?

该用户从未签到

发表于 2010-10-22 17:41:14 | 显示全部楼层
"没有在KeyDown事件的处理函数中把数据传递给OSG吧?参看osgviewerMFC例子,KeyDown函数中
mOSG->getViewer()->getEventQueue()->keyPress(...);
mOSG->getViewer()->getEventQueue()->mouseButtonPress(...);"

mOSG->getViewer()->getEventQueue()->mouseButtonPress(...);"
这里怎么设?

该用户从未签到

发表于 2010-10-22 17:44:12 | 显示全部楼层
mOSG->getViewer()->getEventQueue()->mouseButtonPress(...);
应放到哪个消息里?
??

该用户从未签到

发表于 2010-10-25 01:22:36 | 显示全部楼层
为什么用什么MFC,QT之类的,直接用windows SDK编写程序不就完了吗?
好像图形类的程序都没有用什么界面库吧?大家说说用QT或者MFC之类比起系统API有什么优势,性能好???

该用户从未签到

发表于 2010-10-25 09:00:14 | 显示全部楼层
MFC我不评价,Qt是目前世界上最好的跨平台GUI库,它不仅支持种类繁多的标准控件和操作方法,还支持窗口布局,线程,数据库,D-Bus通讯……种种,并且这些都是跨平台和开源的!

该用户从未签到

发表于 2010-12-6 10:44:49 | 显示全部楼层
Hi!你好,请问您能告诉我这具体是怎么实现的吗。这帖子时间挺久远的了,可是我真的需要您的指导

该用户从未签到

发表于 2010-12-6 17:08:56 | 显示全部楼层
能把具体实现方法告诉我吗,我急用,这问题困扰我好久了

该用户从未签到

发表于 2010-12-8 22:03:34 | 显示全部楼层
Static text控件的属性设置中,有一个notify属性,选上试试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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