资源描述
CEGUI 中文输入的完美解决
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 | 0x80;
}
else
{
return HIWORD(lParam) & 0x00FF;
}
}
同样的我们在 WndProc 消息回调中添加代码:
case WM_KEYDOWN:
{
//输入法跟随
IMEFollow(hWnd);
展开阅读全文