MFC unicode列表框中未正确显示俄语字符

MFC unicode列表框中未正确显示俄语字符,unicode,mfc,localization,Unicode,Mfc,Localization,我有一个用MBCS集编译的MFC应用程序 我使用以下代码在常规MBCS对话框上创建了一个unicode列表框: DWORD dwStyle = WS_CHILD|WS_VISIBLE|WS_VSCROLL; hLangListBox = CreateWindowExW(WS_EX_CLIENTEDGE, //extended styles _T(L"listbox"), //control 'class' name

我有一个用MBCS集编译的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);    
其中po.msgstr是从文件读入的CString。在这种情况下,代码页设置为1251

如果我在VisualStudio中检查变量,似乎转换正在正确进行


似乎我的unicode列表框可以显示来自MBCS(如Chinese fine)的unicode字符,但它不能显示来自SBCS(与我当前的代码页不同)的unicode字符。

我尚未解决此问题,但我认为这可能是字体问题。我不打算进一步讨论这一点,但下一步将是拥有一个所有者绘制的列表框,并为每种语言指定适当的字体。同样的问题,在很长时间后得到解决。
在我的例子中,对话框的默认字体设置为“MS Sans Serif”,只需更改为使用较新的字体“Microsoft Sans Serif”,所有问题都已解决

只是出于好奇-当你使用Unicode时,为什么你的应用程序是用MCB编译的?为什么不将其编译为Unicode应用程序?在这个阶段,它破坏了太多东西。这是第一步。奇怪的是,你得到了一个Unicode窗口。您使用MBCS编译,但使用MFC的Unicode版本?这可能会产生一些有趣的影响。据我所知,我没有使用MFC的unicode版本。您是否对俄语文本使用SendMessage或SendMessageW?此代码snipet解决了字体问题,至少对我来说是这样的:CFont font;if(font.CreatePointFont(100,_T(“Microsoft无衬线”))dlg->SetFont(&font);
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()));
CA2W tmp_wide(po.msgstr,CodePage);
m_LanguageNames[i] = tmp_wide;