我有一個用MBCS集編譯的MFC應用程序。俄語字符在MFC unicode列表框中沒有正確顯示
我創建了一個統一列表框中定期MBCS使用下面的代碼對話框:
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);
當我檢查使用間諜+ +我看到我的窗口過程這個對話框:有(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()));
事情看起來好於大多數項目的數據,我填充列表框使用以下命令之一,
我可以看到
中國:中文(簡體)
法語:法語
日本:日本
但俄羅斯人看起來像一個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字符。
出於好奇 - 爲什麼在使用Unicode時應用程序使用MCBS進行編譯?你爲什麼不把它編譯成一個Unicode應用程序? –
在這個階段它打破了太多的事情。這是第一步。 – JonDrnek
嗯,奇怪的是你得到一個Unicode窗口。您使用MBCS進行編譯,但使用MFC的Unicode版本?這可能會產生一些有趣的影響。 –