在imgui_impl_win32.cpp的ImGui_ImplWin32_WndProcHandler中处理输入法,把输入的字符通过接口io.AddInputCharacter添加到Imgui的buff里面,然后Imgui.InputText在绘制的时候把里面的内容绘制出来
因为输入的是GBK编码,所以在io.AddInputCharacter之前需要把文本转成utf-8编码才行。参考[1][2][3].
其实,输入的是什么编码,决定的是VS里面设置的是多字符集还是unicode字符集。
先理解几个问题
参考[4],简单来说
自己测试了一下:在input text控件里面输入中文:啊。在两种字符集下面wParam得到的编码是不一样的
// 多字节字符集
0xB0A1 -- 对应的是GBK编码十六进制表示
// unicode字符集
0x554a -- 对应的是Unicode编码十六进制表示
参考[4][5]
参考[6]
简体中文、繁体中文这两个都是一样的
针对两种字符集,解决方案如下。
case WM_CHAR:
{
DWORD wChar = wParam;
if (wChar <= 127)
{
io.AddInputCharacter(wChar);
}
return 0;
}
case WM_IME_CHAR:
{
auto& io = ImGui::GetIO();
DWORD wChar = wParam;
if (wChar <= 127)
{
io.AddInputCharacter(wChar);
}
else
{
// swap lower and upper part.
BYTE low = (BYTE)(wChar & 0x00FF);
BYTE high = (BYTE)((wChar & 0xFF00) >> 8);
wChar = MAKEWORD(high, low);
wchar_t ch[6];
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)&wChar, 4, ch, 3);
io.AddInputCharacter(ch[0]);
}
return 0;
}
if (wParam > 0 && wParam < 0x10000)
io.AddInputCharacterUTF16((unsigned short)wParam);
不过注意下,在example里面如果要显示中文的话,需要加一下中文字体。在mian.cpp里面
io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesChineseFull());
这也就是在vs设置为多字符集的时候才需要转换,如果设置为unicode字符集的时候根本就不需要。
[1]issues
[2]Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic?
[3]Problem with chinese or japanese input #1807
[4]WM_IME_CHAR 与WM_CHAR的区别
[5]WM_CHAR,WM_UNICHAR,WM_IME_CHAR
[6]MultiByteToWideChar函数中的CP_ACP和CP_OEMCP参数
[7]Visual Studio——使用多字节字符集与使用Unicode字符集