当前位置: 首页 > article >正文

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;
	}
};

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


http://www.kler.cn/a/159628.html

相关文章:

  • CSS的综合应用例子(网页制作)
  • 探索 HTML 和 CSS 实现的蜡烛火焰
  • 树莓派(Raspberry Pi)Pico 2 C_C++开发环境配置(Docker+SDK)
  • Unity 性能优化方案
  • 基于海思soc的智能产品开发(两个图像处理来源)
  • OCR识别铁路电子客票
  • 使用Pytorch从零开始实现BERT
  • python爬虫-某公开数据网站实例小记
  • vue中el-upload结合vuedraggable实现图片的上传、排序、删除以及预览等功能
  • 2023-12-01 AndroidR 系统在root目录下新建文件夹和创建链接,编译的时候需要修改sepolicy权限
  • 创建腾讯云存储桶---上传图片--使用cos-sdk完成上传
  • 简介Kadane算法及相关的普通动态规划
  • RepidJson将内容格式化后写入文件
  • 【OpenSSH升级】升级后证书认证登录突然失效
  • C语言能判断一个变量是int还是float吗?
  • 若依框架 前台自己获取登录用户信息
  • 矩阵处理—转圈打印矩阵
  • HomeAssistant如何添加HACS插件实现公网控制米家与HomeKit等智能家居
  • Redis的基本数据类型及常用命令
  • Codeforces Round 913 (Div. 3) A~E(F,G更新中)
  • ES6迭代器
  • Elasticsearch一些函数查询
  • 【头歌系统数据库实验】实验4 MySQL单表查询
  • HarmonyOS学习--TypeScript语言学习(三)
  • 图片点击放大
  • go基础语法10问(2)