date: 3/23/2011
介绍:
利用Win32 来处理MyGui 3.0.1的中文输入。
实现:
配置还是参考网上的配置,主要再加中文字体.
如下:
□ 更改配置文件MyGUI3.0\Media\MyGUI_Media下
☆ core_font.xml添加
<Resource type="ResourceTrueTypeFont" name="font_Simhei">
<Property key="Source" value="simhei.ttf"/>
<Property key="Size" value="19"/>
<Property key="Resolution" value="50"/>
<Property key="Antialias" value="false"/>
<Property key="SpaceWidth" value="4"/>
<Property key="TabWidth" value="8"/>
<Property key="CursorWidth" value="2"/>
<Property key="Distance" value="6"/>
<Property key="OffsetHeight" value="0"/>
<Codes>
<Code range="33 126"/>
<Code range="19969 40869"/>
<Code hide="128"/>
<Code hide="1026 1039"/>
<Code hide="1104"/>
</Codes>
</Resource>
☆ simhei.ttf要从系统目录下的Fonts拷贝到当前目录。
☆ core_settings.xml中将默认字体改成
<MyGUI type="Font">
<Property key="Default" value="font_Simhei"/>
</MyGUI>
运行Demo解决方案: solution_directx。
给BaseManager添加Win32消息响应函数void ProcIO(UINT messgae, WPARAM wParam, LPARAM lParam ).
case WM_CHAR:
case WM_KEYDOWN:
case WM_KEYUP:
{
base::BaseManager *baseManager = (base::BaseManager*)GetWindowLongPtr(hWnd, GWL_USERDATA);
if ( baseManager )
baseManager->ProcIO( uMsg , wParam , lParam );
break;
}
ProcIO主要是对
WM_CHAR 字符响应
WM_KEYDOWN/WM_KEYUP 按键响应
在处理字符响应的时候需要区分输入法状态和非输入法状态的字符响应。
case WM_CHAR:
{
if ( ImmIsIME( GetKeyboardLayout(0) ))
ProcChar( wParam , lParam );
else
{
MyGUI::InputManager::getInstance().injectKeyPress(MyGUI::KeyCode::Enum(scan_code), code_point);
};
}
break;
ProcChar函数主要处理中文。因为汉字为8个字节会响应WM_CHAR2次。需要进行组合一次。
WM_KEYDOWN:主要处理一些Widget字符输入。同时还可以做全局键盘信息监控(快捷键).
判断一个Widget是否可以进行字符输入:
\MyGUIEngine\include\MyGUI_InputManager.cpp
bool InputManager::isKeyInputCapture()
{
if( !mWidgetKeyFocus ) return false;
std::string strName = mWidgetKeyFocus->getTypeName();
if ( strName == "ComboBox" ||
strName == "Edit" ||
strName == "Message" ||
strName == "List")
{
return true;
}
return false;
}
由于采用Win32键盘消息,应该屏蔽自带OIS的。
Input\OIS\InputManager.cpp
void InputManager::captureInput()
{
if (mMouse) mMouse->capture();
//mKeyboard->capture();
}
在Demo中监控按键消息( DemoKeeper功能是UIManager )。
void DemoKeeper::injectKeyPress(MyGUI::KeyCode _key, MyGUI::Char _text)
{
if (_key == MyGUI::KeyCode::Grave)
{
mConsole->setVisible(!mConsole->isVisible());
return;
}
else if (_key == MyGUI::KeyCode::F2 )
{
MyGUI::Message::createMessageBox("Message", "Info", "Press F2 ", MyGUI::MessageBoxStyle::Ok | MyGUI::MessageBoxStyle::IconInfo);
return;
}
else if (_key == MyGUI::KeyCode::F3 )
{
MyGUI::Message::createMessageBox("Message", "Info", "Press F3 ", MyGUI::MessageBoxStyle::Ok | MyGUI::MessageBoxStyle::IconInfo);
return;
}
base::BaseManager::injectKeyPress(_key, _text);
}
最后附上源码解决方案:
/Files/expter/MyGuiDemo.rar
图片: