查看: 1692|回复: 3

【已解决】OSG和MFC集成,事件怎么只有一个view可以响应?

[复制链接]

该用户从未签到

发表于 2013-4-18 14:51:30 | 显示全部楼层 |阅读模式
本帖最后由 lglgaigogo 于 2013-4-19 17:18 编辑

请无视这个问题,_我不知为什么把tmpView->getCamera()->setAllowEventFocus( false )写了两遍,注释的时候只注释了一个。
如图:
TM截图20130418144321.png

有两个CView,对应到osg里的两个osgViewer::View。如下初始化:
  1. void cOSG::SetupCamera(HWND hWnd,short ID)
  2. {
  3.         if (NULL == m_CompositeViewer)
  4.         {
  5.                 TRACE(_T("Viewer not ready"));
  6.                 return;
  7.         }

  8.         osg::ref_ptr<osgViewer::View> _tmpView;
  9.         switch(ID)
  10.         {
  11.         case MAPVIEW:
  12.                 m_MapView = new osgViewer::View;
  13.                 _tmpView = m_MapView;
  14.                 break;
  15.         case MAINVIEW:
  16.         default:
  17.                 m_MainView = new osgViewer::View;
  18.                 _tmpView = m_MainView;
  19.                 break;
  20.         }

  21.         m_CompositeViewer->addView(_tmpView.get());

  22.         // Add a Stats Handler to the viewer
  23.         //用来显示系统运行的信息,包括帧率,CPU占用等
  24.         osg::ref_ptr<osgViewer::StatsHandler> stats_handler = new osgViewer::StatsHandler;
  25.         //按“i”键显示
  26.         stats_handler->setKeyEventTogglesOnScreenStats('i');
  27.         _tmpView->addEventHandler(stats_handler.get());


  28.         // Local Variable to hold window size data
  29.         RECT rect;

  30.         // Get the current window size
  31.         ::GetWindowRect(hWnd, &rect);

  32.         // Init the GraphicsContext Traits
  33.         osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;

  34.         // Init the Windata Variable that holds the handle for the Window to display OSG in.
  35.         osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(hWnd);

  36.         // Setup the traits parameters
  37.         traits->x = 0;
  38.         traits->y = 0;
  39.         traits->width = rect.right - rect.left;
  40.         traits->height = rect.bottom - rect.top;
  41.         traits->windowDecoration = false;
  42.         traits->doubleBuffer = true;
  43.         traits->sharedContext = 0;
  44.         traits->setInheritedWindowPixelFormat = true;
  45.         traits->inheritedWindowData = windata;

  46.         // Create the Graphics Context
  47.         osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());

  48.         // Assign Graphics Context to the Camera
  49.         _tmpView->getCamera()->setGraphicsContext(gc.get());

  50.         // Set the viewport for the Camera
  51.         _tmpView->getCamera()->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));


  52.         float scale = 17.0;
  53.         switch(ID)
  54.         {
  55.         case MAPVIEW:
  56.                 _tmpView->getCamera()->setClearColor( osg::Vec4(0.0f, 0.2f, 0.0f, 1.0f) );
  57.                 _tmpView->getCamera()->setRenderOrder( osg::Camera::POST_RENDER );
  58.                 _tmpView->getCamera()->setAllowEventFocus( false );/////在这里,我没有看见啊。。。。
  59.                 _tmpView->getCamera()->setClearMask( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  60.                 _tmpView->getCamera()->setReferenceFrame( osg::Transform::ABSOLUTE_RF );

  61.                 _tmpView->getCamera()->setViewMatrix( osg::Matrixd::lookAt(osg::Vec3(0.0f, 0.0f, 120.0f), osg::Vec3(0.0,0.0,0.0), osg::Y_AXIS) );
  62.                 _tmpView->getCamera()->setProjectionMatrix( osg::Matrixd::ortho2D(-1.0*scale*traits->width, 1.0*scale*traits->width, -1.0*scale*traits->height, 1.0*scale*traits->height) );
  63.        
  64.                 _tmpView->addEventHandler(new testkeyhandler());
  65.                 _tmpView->setSceneData(m_MapRoot.get());
  66.                 break;
  67.         case MAINVIEW:
  68.         default:
  69.                 //设置主视图相机
  70.                 _tmpView->getCamera()->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
  71.                 _tmpView->getCamera()->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  72.                 _tmpView->getCamera()->setClearColor(osg::Vec4f(0.2f, 0.2f, 0.4f, 1.0f));
  73.                 _tmpView->getCamera()->setProjectionMatrixAsPerspective(
  74.                         60.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 1.0, 1000.0);
  75.                
  76.                 // Add the Camera Manipulator to the Viewer
  77.                 _tmpView->setCameraManipulator(m_keyswitchManipulator.get());
  78.                 _tmpView->setSceneData(m_MainRoot.get());
  79.                 break;
  80.         }

  81.         // Set the Scene Data
  82. }
复制代码
这个函数的第一个参数就是MFC里的CView的hWnd。
现在的问题是:显示没有问题,就是第2个View(小地图)不能响应事件。

该用户从未签到

发表于 2013-4-18 15:04:00 | 显示全部楼层
_tmpView->getCamera()->setAllowEventFocus(false);

该用户从未签到

 楼主| 发表于 2013-4-18 15:11:45 | 显示全部楼层
本帖最后由 lglgaigogo 于 2013-4-18 16:00 编辑
liuzhiyu123 发表于 2013-4-18 15:04
_tmpView->getCamera()->setAllowEventFocus(false);

对不起,我没有看见啊。。。
我是不是瞎了。唉。谢谢您的提示。

该用户从未签到

发表于 2013-4-18 16:08:26 | 显示全部楼层
字体不用搞那么大吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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