本文主要是介绍MyGui 的中文输入,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
先说说处理中文输入的思路:
刚开始想像CEGUI那样处理中文输入,于是去看MyGUI关于输入的源代码,觉得不可行 !
想想正常输入字符的时候(没有打开输入法的时候),每输入一个字符,源代码里有个接口会进行对ascii码的翻译,
但这种翻译仅对于“English”,那汉字又怎么翻译呢? 于是想到了截取中文(详细见HookIME),既然已经做了中文显示,
我们可以自己处理所有的字符包括中文字符,而不需要大动MyGUI的源代码!
既然我们要自己处理字符,就得得到MyGUI在输入时得到的字符,于是在源代码里加了接口:
MyGUI::Char getKeyChar(void); 返回每次输入得到的字符(没有打开输入法的时候)。
剩下的就是自己处理中文输入的问题了 : )
///简单的代码如下:
bool Listener::keyPressed ( const OIS::KeyEvent &arg )
{
///打开输入法后的字符处理
if(ImmIsIME(GetKeyboardLayout(0)))
{
///中文输入及数字键输入
if(arg.key == OIS::KC_BACK)
{
GHyGuiManagerPtr->keyPressed(arg);
///得到文本光标的位置
pos = GHyGuiMainWindowPtr->getTextCursor();
///保存最新的文本
deleteText(pos);
///更新聊天框文本
GHyGuiMainWindowPtr->setText(getTextContainer());
///更新光标的位置
GHyGuiMainWindowPtr->setTextCursor(pos);
}
else if(arg.key == OIS::KC_SPACE ||
arg.key == OIS::KC_0 ||
arg.key == OIS::KC_1 ||
arg.key == OIS::KC_2 ||
arg.key == OIS::KC_3 ||
arg.key == OIS::KC_4 ||
arg.key == OIS::KC_5 ||
arg.key == OIS::KC_6 ||
arg.key == OIS::KC_7 ||
arg.key == OIS::KC_8 ||
arg.key == OIS::KC_9)
{
///保存到容器
std::string str = lpGetString();///截取中文字符串
///收集汉字字符
getTextContainer(str);
unsigned int num = 0;
///插入字符串及更新相关信息
for(VECSTR::iterator it = mCNSContainer.begin(); it != mCNSContainer.end(); ++it)
{
///得到文本光标的位置
pos = GHyGuiMainWindowPtr->getTextCursor();
///插入汉字字符串
insertText(pos + num + 1,(*it));
///更新聊天框文本
GHyGuiMainWindowPtr->setText(getTextContainer());
///更新光标的位置
GHyGuiMainWindowPtr->setTextCursor(pos + 1);
}
}
return false;
}
//关闭输入法后的字符处理
else
{
///如果按退格键
if(arg.key == OIS::KC_BACK)
{
///继续处理按键输入(删除)
GHyGuiManagerPtr->keyPressed(arg);
///得到文本光标的位置
pos = GHyGuiMainWindowPtr->getTextCursor();
///保存最新的文本
deleteText(pos);
///更新聊天框文本
GHyGuiMainWindowPtr->setText(getTextContainer());
///更新光标的位置
GHyGuiMainWindowPtr->setTextCursor(pos);
}
else
{
///处理按键输入(插入)
GHyGuiManagerPtr->keyPressed(arg);
///得到文本光标的位置
pos = GHyGuiMainWindowPtr->getTextCursor();
///保存到容器
std::string str;
str.push_back(GHyGuiManagerPtr->getKeyChar());
///插入字符
insertText(pos,str);
///更新聊天框文本
GHyGuiMainWindowPtr->setText(getTextContainer());
///更新光标的位置
GHyGuiMainWindowPtr->setTextCursor(pos + 1);
}
}
return true;
}
以上版本是MyGUI 2.0
现在的MyGUI3.0 已经不需要这样处理了,CEGUI 怎么处理, MYGUI 也怎么处理 lucky :)
这篇关于MyGui 的中文输入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!