MFC对话框集成OSG无法响应键盘事件

        最近编译了OSG3.7的源码,通过MFC对话框集成显示。使用过程中,自定义的按键消息无法正常响应(控制台窗口通过openGL的设备上下文环境可以正常响应,所以不是输入法的问题)。网上搜了一下,发现相关文章很少,有一个人反馈的问题http://bbs.osgchina.org/forum.php?mod=viewthread&tid=9747和我遇到的问题一致,但是没说怎么解决的。osg官方集成MFC的demo是基于多文档视图,而且貌似无法正常运行,坑。

        简单跟踪了一下源码,原来是MFC默认对话框的KEY_DOWN/KEY_UP消息被界面上的其他控件捕获了,所以基于窗体的m_hWnd绘制的OSG场景无法捕获键盘消息。测试了一下,果真如此。解决办法有两个。

删除界面上的所有控件,

只保留原声窗体(默认的确定/取消按钮也不行,也需要删掉)。

 

{
。。。。。

    mOSG = new cOSG(m_hWnd);

	// Init the osg class
	mOSG->InitOSG("dumptruck.osg");
}

第二种方法是,新增一个控件,利用控件的m_hWnd绘制osg场景。 

{
    .....
    mOSG = new cOSG(GetDlgItem(IDC_STATIC)->m_hWnd);

	// Init the osg class
	mOSG->InitOSG("dumptruck.osg");
}

然后自己重载osgGA::GUIEventHandler的虚函数handle,简单测试胆码如下

class KeyBoardCtrlMgr : public osgGA::GUIEventHandler
{
public:
	KeyBoardCtrlMgr(){} 
	~KeyBoardCtrlMgr() {}

	bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
	{
		bool bRet(false);
		osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
		if (viewer == NULL) return bRet;

		static int _s = 0;
		switch (ea.getEventType())
		{
		case osgGA::GUIEventAdapter::KEYDOWN:
		case osgGA::GUIEventAdapter::KEYUP:
			if (ea.getKey() == osgGA::GUIEventAdapter::KEY_0)
			{
				osg::notify(osg::NOTICE) << "Saved model to file 'saved_model.osgt'" << std::endl;
				bRet = true;
			}
			else if (ea.getKey() == osgGA::GUIEventAdapter::KEY_1)
			{
				osg::notify(osg::NOTICE) << "Saved model to file 'saved_model.osgt'" << std::endl;

				bRet = true;
			}
			break;
		case osgGA::GUIEventAdapter::PUSH:
		case osgGA::GUIEventAdapter::MOVE:
		{
			osg::notify(osg::NOTICE) << "Saved model to file 'saved_model.osgt'" << std::endl;
			bRet = true;
			break;
		}
		default:
			break;
		}
		return bRet;
	}
};

效果都正常,简单记录一下。

相关推荐

  1. WPF 键盘事件捕获

    2023-12-07 15:42:05       27 阅读
  2. Qt | 键盘事件

    2023-12-07 15:42:05       12 阅读
  3. 【React】React响应事件

    2023-12-07 15:42:05       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 15:42:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 15:42:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 15:42:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 15:42:05       20 阅读

热门阅读

  1. git 修改 commit 未推送的信息

    2023-12-07 15:42:05       42 阅读
  2. KALI LINUX入门

    2023-12-07 15:42:05       34 阅读
  3. 代码规范及开发工具

    2023-12-07 15:42:05       44 阅读
  4. Linux虚假唤醒

    2023-12-07 15:42:05       45 阅读
  5. Python【走出棋盘】

    2023-12-07 15:42:05       32 阅读
  6. entos7系统部署elastic6.4.3版本集群

    2023-12-07 15:42:05       36 阅读
  7. Vue3组件中使用ref解决GetElementById为空的问题

    2023-12-07 15:42:05       38 阅读
  8. Vue中下载不同文件的几种方式

    2023-12-07 15:42:05       43 阅读
  9. 微信小程序中 不同页面如何传递参数

    2023-12-07 15:42:05       43 阅读
  10. STM32关键词提取

    2023-12-07 15:42:05       36 阅读