Русские символы не отображаются правильно в списке Unicode MFC - PullRequest
2 голосов
/ 23 августа 2011

У меня есть приложение MFC, скомпилированное с набором MBCS.

Я создал окно со списком 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);    

Когда я проверяю этот диалогиспользуя Spy ++, я вижу, что мой Window Proc: имеет (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

Японцы: 101

, но русский выглядит как P, за которым следует группа баров (P ||||||), а не Pусский.Когда я смотрю на содержимое CStringW в Visual Studio, я вижу правильный текст.

Почему я могу правильно видеть другие языки, а не русский?Я работаю на Windows 7 Ultimate и компилирую с Visual Studio 10

Edit

Если я изменю свой системный языковой стандарт на русский, я могу видеть русские символы в порядке.Тем не менее, ç в Francaise выглядит неправильно.

Я думал, что строки Юникода не зависят от языкового стандарта системы.Это правильно?

Чтобы заполнить мой Unicode CStringW, я делаю:

CA2W tmp_wide(po.msgstr,CodePage);
m_LanguageNames[i] = tmp_wide;

где po.msgstr - это CString, которая была прочитана из файла.В этом случае CodePage устанавливается на 1251

Если я проверяю переменные в Visual Studio, кажется, что преобразование происходит правильно.

Похоже, что мой список Unicode может отображать символы Unicode изMBCS, такой как китайский, но не может отображать символы Юникода из SBCS, который отличается от моей текущей кодовой страницы.

Ответы [ 2 ]

2 голосов
/ 05 декабря 2013

Та же проблема, решаемая через долгое время. В моем случае для шрифта диалогового окна по умолчанию установлено значение « MS Sans Serif », просто измените на использование более нового шрифта « Microsoft Sans Serif », и все будет решено!

0 голосов
/ 07 сентября 2011

Я еще не решил, но, скорее всего, это проблема шрифта. Я не буду вдаваться в подробности, но следующим шагом будет создание списка для рисования владельцем и указание соответствующего шрифта для каждого языка

...