好久又没写文章了,经过这两天的研究,终于搞定了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