CEGUI 中文输入与显示

1. 中文的输入.
  处理windows窗口的WM_IME_COMPOSITION.如下面的源码:

View Code
//......
case WM_IME_COMPOSITION:
codeInput(hWnd, lParam);
break;

//......

//--------------------------------------------------------------------------------------------
// 编码输入
void Win32AppHelper::codeInput(HWND hWnd, LPARAM lParam)
{
static wchar_t buf[1024];
if (lParam & GCS_RESULTSTR)
{
//获取IME句柄
HIMC hIMC = ImmGetContext(hWnd);
//获取Unicode结果字符串的长度,这个长度怎么也不会比1024还长
LONG buflen = ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,NULL,0);
//重置字符串长度的缓冲区为0,否则会出现先前的字符
memset(buf,0, buflen*sizeof(wchar_t));
//获取Unicode结果字符串
ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,buf,buflen);
//逐个字符注入到CEGUI系统中
for (int i=0; i<buflen; i++)
{
CEGUI::System::getSingleton().injectChar((CEGUI::utf32)buf[i]);
}
//释放IME句柄
ImmReleaseContext(hWnd, hIMC);
}
}

2. 中文的显示.
  到windows的font目录下面找一个中文字体,比如"楷书",复制到字体资源目录下面,再建立一个对应的kaishu.font文件,参考其它字体是怎么设置的,再在scheme里面添加这个字体,还要在程序里面使用这个字体:FontManager::getSingleton().create("kaishu.font");
  赋文本给窗口的时候,将中文字符串转换成CEGUI::utf8格式,可以使用下面的转换函数:

View Code
CEGUI::utf8* AToU8(const char* pMbcs)
{
static CEGUI::utf8 g_buf[1024] = {0};
static wchar_t g_Unicode[1024] = {0};
memset(g_Unicode, 0, sizeof(g_Unicode));
memset(g_buf, 0, sizeof(g_buf));
MultiByteToWideChar(CP_ACP, 0, pMbcs, strlen(pMbcs), g_Unicode, 1024);
WideCharToMultiByte(CP_UTF8, 0, g_Unicode, wcslen(g_Unicode), (char*)g_buf, 1024, 0, 0);
return g_buf;
}

然后给窗口赋值的时候,像这样:

View Code
WindowManager::getSingleton().getWindow("root/editbox")->setText((CEGUI::utf8*)(AToU8("中文测试").c_str()));

OK!


原文地址:https://www.cnblogs.com/emyueguang/p/2317239.html