2011-08-22 29 views
2

我有一個用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字符。

+1

出於好奇 - 爲什麼在使用Unicode時應用程序使用MCBS進行編譯?你爲什麼不把它編譯成一個Unicode應用程序? –

+0

在這個階段它打破了太多的事情。這是第一步。 – JonDrnek

+0

嗯,奇怪的是你得到一個Unicode窗口。您使用MBCS進行編譯,但使用MFC的Unicode版本?這可能會產生一些有趣的影響。 –

回答

0

我還沒有解決這個問題,但我認爲這可能是一個字體問題。我不會再想這麼做,但下一步就是讓所有者畫出列表框併爲每種語言指定適當的字體

2

同樣的問題,經過很長時間才解決。 在我的情況下,對話框的默認字體設置爲「MS Sans Serif」,只需更改爲使用最近的字體「Microsoft Sans Serif」,一切都解決了!

+0

此代碼snipet解決了字體問題,至少對我來說: CFont字體; (font.CreatePointFont(100,_T(「Microsoft Sans Serif」))) \t \t dlg-> SetFont(&font); – TarmoPikaro