- 4
- 0
- 约1.86万字
- 约 8页
- 2016-11-27 发布于河南
- 举报
CEGUI中文输入的完美解决
CEGUI中文输入的完美解决
[ 2009-03-18 16:25:18 | 作者: HYPERLINK /user.asp?act=viewid=1Admin ]
字体大小: HYPERLINK javascript:setFontSize(14) \o 字体大小: 大大 | HYPERLINK javascript:setFontSize(11) \o 字体大小: 中中 | HYPERLINK javascript:setFontSize(9) \o 字体大小: 小小
CEGUI中实现中文输入是一个老话题了,网上的资料也很多,但是实现的都不是那么完美,其中最重要的问题就是输入法界面的跟随和输入状态时对按键的屏蔽。先来说下如何把中文输入进入。先添加一个中文注入的函数:
/////// 中文输入注入字符 (Added by Azure)static bool ChnInjectChar(CEGUI::utf32 code_point);///////
函数的实现如下:
bool Win32AppHelper::ChnInjectChar(CEGUI::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;??????CEGUI::utf32 code = (CEGUI::utf32)s_tempWchar[0];??????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}
此函数是我从网上抄来的一个,没有什么特别的,挺好用的。然后在WndProc回调函数中添加:
case WM_CHAR:// 不要这个//CEGUI::System::getSingleton().injectChar((CEGUI::utf32)wParam);// 改用自己的注入ChnInjectChar((CEGUI::utf32)wParam);break;
这样中文就可以基本输入了,但是还有很多问题,原来不能BackSpace删除,和游标移动啊!下面我们来添加控制按键的处理。由于wParam不能直接传入CEGUI中,我们必须写一个虚拟按键到扫描码的翻译函数,我们添加下面一个函数。
/////// 虚拟按键转扫描码 (Added by Azure)static UINT VirtualKeyToScanCode(WPARAM wParam, LPARAM lParam);
该函数的实现为:
UINT Win32AppHelper::VirtualKeyToScanCode(WPARAM wParam, LPARAM lParam){??if(HIWORD(lParam) 0x0F00) ??{ ????UINT scancode = MapVirtualKey(wParam, 0); ????return scancode | 0
原创力文档

文档评论(0)