查看: 2349|回复: 3

求助:MFC程序中建立菜单无法响应鼠标单击

[复制链接]

该用户从未签到

发表于 2011-1-24 16:21:14 | 显示全部楼层 |阅读模式
我自己用MFC做了个OSG的程序,想实现osganimationeasemotion例子中的菜单效果。但是做出来后,就是响应不了单击。鼠标移动可以,但是单击之后,鼠标移动也不响应了。

调试了一下,好像是没有计算到交点,但是没弄清楚原因,不知道那里不对,还请高手指教


关键代码如下,ColorLabelMenu类就是从例子osganimationeasemotion中拷过来的
  1.         // 局部变量存放窗口矩形
  2.         RECT rect;
  3.         // 创建一个viewer
  4.         mViewer = new osgViewer::Viewer();
  5.         // 得到当前窗口矩形
  6.         ::GetClientRect(m_hWnd, &rect);
  7.         // 初始化
  8.         osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
  9.         // 初始化窗口变量,为OSG所用
  10.         osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);
  11.         // 设置一些个参数
  12.         traits->x = 0;
  13.         traits->y = 0;
  14.         traits->width = rect.right - rect.left;
  15.         traits->height = rect.bottom - rect.top-30;
  16.         traits->windowDecoration = false;
  17.         traits->doubleBuffer = true;
  18.         traits->sharedContext = 0;
  19.         traits->setInheritedWindowPixelFormat = true;
  20.         traits->inheritedWindowData = windata;
  21.        
  22.         // 创建图形上下文
  23.         osg::GraphicsContext* gc = osg::GraphicsContext::createGraphicsContext(traits.get());
  24.         // 初始化一个相机
  25.         osg::ref_ptr<osg::Camera> camera = new osg::Camera;
  26.         // 绑
  27.         camera->setGraphicsContext(gc);
  28.         //相机视口设置
  29.         camera->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));

  30.         // 添加相机到VIEWER
  31.         mViewer->addSlave(camera.get());
  32.         // 添加操作器到VIEWER
  33.         mViewer->setCameraManipulator(keyswitchManipulator.get());

  34.         mViewer->addEventHandler(new osgViewer::StatsHandler);


  35.         //旋转视图
  36.         osg::ref_ptr<osg::MatrixTransform > mt(new osg::MatrixTransform);
  37.         mt->setMatrix(osg::Matrix::rotate(osg::DegreesToRadians(-20.0),osg::Vec3(0,0,1))*osg::Matrix::rotate(osg::DegreesToRadians(20.0),osg::Vec3(1,0,0)));
  38.         mt->addChild(mRoot);
  39.        
  40.         osgUtil::Optimizer optimzer;
  41.         optimzer.optimize(mt);
  42.         mViewer->addEventHandler(new GeomPickHandler(mViewer));

  43.         //创建windowsManager对象
  44.         osgWidget::WindowManager* wm = new osgWidget::WindowManager(mViewer,rect.right-rect.left,rect.bottom-rect.top-30,0xF0000000);

  45.         osgWidget::Window* menu = new osgWidget::Box("menu", osgWidget::Box::HORIZONTAL);
  46.         //增加菜单
  47.         menu->addWidget(new ColorLabelMenu("Choose EaseMotion"));
  48.         menu->getBackground()->setColor(1.0f, 1.0f, 1.0f, 1.0f);
  49.         menu->setPosition(15.0f, 35.0f, 0.0f);

  50.         wm->addChild(menu);

  51.         //设置相机
  52.         osg::Camera * camera2 = wm->createParentOrthoCamera();
  53.         osg::Group *  group  = new osg::Group();

  54.         group->addChild(camera2);
  55.         group->addChild(mt);

  56.         mViewer->addEventHandler(new osgWidget::MouseHandler(wm));

  57.         wm->resizeAllWindows();

  58.         mViewer->setSceneData(group);

  59. mViewer->realize();
复制代码

该用户从未签到

发表于 2011-1-24 18:18:35 | 显示全部楼层
请您先参考下osgMFCViewer这个例子,,学习一下OSG+MFC开发框架~~~~

该用户从未签到

 楼主| 发表于 2011-1-25 08:17:55 | 显示全部楼层
本帖最后由 qingfeng5211 于 2011-1-25 08:20 编辑

2# FlySky

多谢,我就是按照osgViewerMFC例子做的,给出的代码就是修改了InitCameraConfig函数的内容。个人感觉是camera用的不对,但是不知道怎么改。还请指点。


下面是仿照osgAnimationEaseMotion例子,向InitCameraConfig添加的
  1.         //创建windowsManager对象
  2.         osgWidget::WindowManager* wm = new osgWidget::WindowManager(mViewer,rect.right-rect.left,rect.bottom-rect.top-30,0xF0000000);
  3. //创建菜单
  4.         osgWidget::Window* menu = new osgWidget::Box("menu", osgWidget::Box::HORIZONTAL);
  5.         //增加菜单
  6.         menu->addWidget(new ColorLabelMenu("Choose EaseMotion"));
  7.         menu->getBackground()->setColor(1.0f, 1.0f, 1.0f, 1.0f);
  8.         menu->setPosition(15.0f, 35.0f, 0.0f);

  9.         wm->addChild(menu);

  10.         //设置相机
  11.         osg::Camera * camera2 = wm->createParentOrthoCamera();
  12.         osg::Group *  group  = new osg::Group();

  13.         group->addChild(camera2);
  14.         group->addChild(mt);//mt为根节点

  15.         mViewer->addEventHandler(new osgWidget::MouseHandler(wm));

  16.         wm->resizeAllWindows();

  17.         mViewer->setSceneData(group);
复制代码

该用户从未签到

 楼主| 发表于 2011-1-25 14:10:53 | 显示全部楼层
才发现是自己实现的一个GUIEventHandler的问题,不添加它就OK了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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