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
圖片: