CEGUI學習筆記四-- [轉載]如何輸入中文

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章