我有一个使用MBCS set编译的MFC应用程序。
我使用以下代码在常规MBCS对话框上创建了一个unicode列表框:
DWORD dwStyle = WS_CHILD|WS_VISIBLE|WS_VSCROLL;
hLangListBox = CreateWindowExW(WS_EX_CLIENTEDGE, //extended styles
_T(L"listbox"), //control 'class' name
L"Language", //control caption
dwStyle, //control style
10, //position: left
10, //position: top
200, //width
100, //height
GetSafeHwnd(), //parent window handle
//control's ID
reinterpret_cast<HMENU>(static_cast<INT_PTR>(ID_LANGUAGE_ENGLISH+20)),
AfxGetInstanceHandle(), //application instance
0);
当我使用Spy ++检查此对话框时,我看到我的Window Proc:has(Unicode)所以我相信它是正确创建的。
我使用以下命令之一填充列表框,具体取决于我是否具有unicode字符串或常规字符串中的数据
CStringW m_LanguageNames[MAX_LANG];
CString sFilename;
....
::SendMessageW(hLangListBox,LB_INSERTSTRING ,nMenuPos,reinterpret_cast<LPARAM>(theApp.m_LanguageNames[i].GetBuffer()));
::SendMessage(hLangListBox,LB_INSERTSTRING ,nMenuPos,reinterpret_cast<LPARAM>(sFileName.GetBuffer()));
大多数参赛作品看起来都不错,
我可以看到
中文:中文(简体)
法语:Française
日语:日本
但是俄语看起来像是P后面跟着一堆酒吧(P ||||||),而不是Pусский。当我在Visual Studio中查看CStringW的内容时,我确实看到了正确的文本。
为什么我能正确看到其他语言而不是俄语?我在Windows 7旗舰版上运行并使用Visual Studio 10进行编译
修改
如果我将系统区域设置更改为俄语,我可以看到俄语字符很好。但是,Française中的ç似乎不正确。
我认为unicode字符串独立于系统区域设置。这是对的吗?
要填充我正在做的unicode CStringW:
CA2W tmp_wide(po.msgstr,CodePage);
m_LanguageNames[i] = tmp_wide;
其中po.msgstr是从文件读入的CString。在这种情况下,CodePage设置为1251
如果我在Visual Studio中检查变量,则表明转换正确发生。
我的unicode列表框似乎可以显示MBCS中的unicode字符,例如中文,但是它不能显示与我当前代码页不同的SBCS中的unicode字符。
答案 0 :(得分:2)
同样的问题,很长一段时间后解决了。 在我的情况下,默认的对话框字体设置为“ MS Sans Serif ”,只需更改为使用更新的字体“ Microsoft Sans Serif ”,一切都已解决!< / p>
答案 1 :(得分:0)
我还没有解决这个问题,但我认为这可能是一个字体问题。我不会再这么做了,但下一步是拥有一个所有者绘制的列表框并为每种语言指定一个合适的字体