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

作者在集成OSG3.7到MFC对话框时遇到自定义按键不响应的问题,发现是MFC默认对话框捕获了键盘消息。解决方法包括移除所有控件仅保留窗口或创建新控件重载GUIEventHandler。
摘要由CSDN通过智能技术生成

        最近编译了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;
	}
};

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老朱自强不息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值