OSG+MyGUI结合下中文输入的若干问题

本文总结了在OSG+MyGUI环境下处理中文输入遇到的问题及解决方法。包括小键盘数字输入问题,通过检查num lock状态并转换键值来解决;以及中文输入问题,介绍了通过修改osg源码和使用钩子方法实现中文输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久又没写文章了,经过这两天的研究,终于搞定了OSG+MYGUI的中文输入问题,现在进行一下所遇问题的汇总,方便自己以后查阅

问题1、小键盘数字的输入问题(这个是很久以前解决的)

osg并不能给你真正的小键盘输入值,还是得自己处理

代码片段1:

if ((ea.getModKeyMask() & osgGA::GUIEventAdapter::MODKEY_NUM_LOCK)!=0)
{
std::cout<<"小键盘数字键开启?"<<std::endl;
..
}

可以在上面这段代码中进行它给的默认键值到数字键值之间转换。但是你以为事情这样就完成了?no

osg对于num lock的状态处理有问题。

大体应该是osg默认小键盘的num lock是关闭的(不管它目前是开着,还是关着,PS:这是自己的理解,没有更深入下去),这样,问题来了,如果键盘初始状态也是关闭着的,没有问题,可以在上面那段代码写自己的小键盘输入处理内容,但是如果初始num lock是开着的,问题就来了,osg给你的总是一个num lock反的结果。

本着不改OSG源码的初衷,我得解决方法是:

首先建立默认小键盘值与数字键的映射

代码片段2:

        s_numkeyCodeMap[osgGA::GUIEventAdapter::KEY_KP_Insert]=
osgGA::GUIEventAdapter::KEY_0;


s_numkeyCodeMap[osgGA::GUIEventAdapter::KEY_KP_End]=
osgGA::GUIEventAdapter::KEY_1;


s_numkeyCodeMap[osgGA::GUIEventAdapter::KEY_KP_Down]=
osgGA::GUIEventAdapter::KEY_2;


s_numkeyCodeMap[osgGA::GUIEventAdapter::KEY_KP_Page_Down]=
osgGA::GUIEventAdapter::KEY_3;


s_numkeyCodeMap[osgGA::GUIEventAdapter::KEY_KP_Left]=
osgGA::GUIEventAdapter::KEY_4;


s_numkeyCodeMap[osgGA::GUIEventAdapter::KEY_KP_Begin]=
osgGA::GUIEventAdapter::KEY_5;


s_numkeyCodeMap[osgGA::GUIEventAdapter::KEY_KP_Right]=
osgGA::GUIEventAdapter::KEY_6;


s_numkeyCodeMap[osgGA::GUIEventAdapter::KEY_KP_Home]=
osgGA::GUIEventAdapter::KEY_7;


s_numkeyCodeMap[osgGA::GUIEventAdapter::KEY_KP_Up]=
osgGA::GUIEventAdapter::KEY_8;


s_numkeyCodeMap[osgGA::GUIEventAdapter::KEY_KP_Page_Up]=
osgGA::GUIEventAdapter::KEY_9;

不用代码片段1来检查num lock的开启状态,替换为以下:

if (::GetKeyState(VK_NUMLOCK)&0x01)
{
std::map<int,int>::const_iterator itera=s_numkeyCodeMap.find(key);
if (itera!=s_numkeyCodeMap.end())
{
key=itera->secon

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值