2008.5.5
[修改] 修改了關於工具函數的命名,使上下文統一
[修改] 修改了CEGUI::System::getSingleton().injectChar(...),原文沒有調用 獲取單件。
感謝 [email protected] 指出了以上錯誤。
--------------------------------------------------------------------------------
原貼URL:http://tb.blog.csdn.net/TrackBack.aspx?PostId=1509217(已無效)
轉帖URL:http://www.cnblogs.com/yoran/archive/2008/02/15/1069388.html
--------------------------------------------------------------------------------
這不是正統的輸入法解決方案,只是通過掛載Windows的輸入法處理模塊來快速實現中文輸入法的支持。
主要步驟我在這裏摘出來了:
1、在例子工程裏全解決方案搜索 “CEGUI::System::getSingleton().injectChar”,你可能會在如下的地方找到:
CEGuiOpenGLBaseApplication.cpp(379)
Win32AppHelper.cpp(100行左右吧,我已經修改了....)
如果你還包含了別的BaseApplication,可能會在別的地方找到,但是這些代碼都長的很象這個樣子:
// inject Character code
CEGUI::System::getSingleton().injectChar(.....);
並且一般都會是在一個switch結構裏。
2、在使用這句話的函數外面添加下面這個函數:
namespace CEGUI...{
bool _injectChar(utf32 code_point )
...{
#ifndef UNICODE
static char s_tempChar[3] = "";
static wchar_t s_tempWchar[2] = L"";
static bool s_flag = false;
unsigned char uch = (unsigned char)code_point;
if( uch >= 0xA1 )
...{
if( !s_flag )
...{
s_tempChar[0] = (char)uch; //第一個字節
s_flag = true;
return true;
}
else if( uch >= 0xA1 )
...{
s_tempChar[1] = (char)uch; //第二個字節
s_flag = false;
MultiByteToWideChar( 0, 0, s_tempChar, 2, s_tempWchar, 1); //轉成寬字節
s_tempWchar[1] = L'/0';
utf32 code = (utf32)s_tempWchar[0];
//Font* fnt = System::getSingleton().getDefaultFont();
return CEGUI::System::getSingleton().injectChar( code );
}
else
...{
return CEGUI::System::getSingleton().injectChar(code_point);
}
}
else
...{
s_flag = false;
return CEGUI::System::getSingleton().injectChar(code_point);
}
#else
return CEGUI::System::getSingleton().injectChar(code_point );
#endif
}
}
該函數進行了國標碼的轉換,如果不想了解規則,當工具函數用就可以了。
3、將原來的事件插入語句CEGUI::System::getSingleton().injectChar(.....); 改成:
if (ImmIsIME(GetKeyboardLayout(0)))
...{
CEGUI::_injectChar(Key);
}
else
...{
CEGUI::System::getSingleton().injectChar((CEGUI::utf32)Key);
}
4、在該CPP文件頭加入
#include <imm.h>
#pragma comment(lib,"imm32.lib")
5、這樣的話,CEGUI就可以掛載Windows的輸入法處理模塊了。如果你看過我上一個筆記,一定知道如何去修改scheme文件以支持顯示中文。另外上述代碼如果編譯不通過的話,一定是命名之類的問題,耐心點修改吧,一般來說,C來的代碼都需要修改才能用的。
6、編譯一個有輸入框的例子,比如FalagarDemo1,注意修改FalagarDemo1所使用的scheme文件。
輸入看看?
7、還有一個問題就是關於BackSpace的:如果你在輸入框裏有字,這個時候輸入法輸入框裏輸入錯了一個字符,當你按backspace的時候,CEGUI裏的輸入框上的字也被刪了一個。這不是我們期望的行爲,解決這個問題有很多途徑,你可以在中間渲染層進行這些輸入事件插入之前進行判斷,也可以註冊監聽事件進行處理,但是我認爲最正確的方法是在需要進行輸入法輸入的地方,比如EditBox的事件處理函數裏特別處理backspace,當然,這需要修改CEGUIEditbox的源代碼,不過這件事並不困難。
8、最近在看window 、WindowManager、system等一些CEGUI整體框架上的代碼,建議和我一樣剛接觸CEGUI的朋友們一定要看一看源代碼,這樣才能瞭解 什麼對象 具有哪些變量,分別對應了什麼屬性,又有什麼操作。剛剛開始看的時候必然十分痛苦,但是相信我,等你從它的事件機制繞出來的時候,你的編程水平一定會發生一些改變:)
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/kun1234567/archive/2008/04/15/2294125.aspx