Создание приложения Win32 Window с английской строкой заголовка, но строка заголовка становится китайской из ниоткуда. Почему?

HWND wndHandle; //global variable

// code snipped

WNDCLASSEX wcex;

// code snipped

wcex.lpszClassName = (LPCWSTR) "MyTitleName";

 // code snipped

wndHandle = CreateWindow(
            (LPCWSTR)"MyTitleName",     //the window class to use
            (LPCWSTR)"MyTitleName",     //the title bar text
...
...

Я следую руководству по оконному приложению Win32. Приведенный выше код используется для установки имени строки заголовка экрана окна. Компилятор кричит мне: «Невозможно преобразовать из 'const char [12]' в 'LPCWSTR'», так что ладно, я привел свою строку «MyTitleName» с помощью (LPCWSTR), и все скомпилировалось просто отлично. Однако во время выполнения заголовок экрана окна оказывается китайскими иероглифами. Я попытался изменить строку, и китайские иероглифы всегда каким-то образом меняются в соответствии с моей строкой. Я использую XP Visual C++ 2008 Express Edition, и я получил английский (США) в качестве настройки для программ, не поддерживающих юникод. Я не понимаю. Как получилось, что строка стала китайской?


person Karl    schedule 21.01.2010    source источник


Ответы (2)


Ваше приложение компилируется как приложение юникода (это определяется в настройках проекта). Это означает, что строки, которые вы передаете функциям API Windows, должны быть строками расширенных символов, указанными следующим образом: L"MyTitleName". Вы не можете привести к LPCWSTR, потому что это фактически не изменит тип строки, он просто попытается передать строку как нечто, чем она не является.

Этот код должен работать:

wcex.lpszClassName = L"MyTitleName";

 // code snipped

wndHandle = CreateWindow(
            L"MyTitleName",     //the window class to use
            L"MyTitleName",     //the title bar text
            ...

Если вы хотите использовать исходный код из учебника без его изменения, вы можете отключить режим юникода: в свойствах проекта перейдите на вкладку «Общие» и установите Character Set на Use Multi-Byte Character Set. Не делайте этого ни для какой программы, которая когда-нибудь должна будет поддерживать дополнительные языки.

person interjay    schedule 21.01.2010

Это из-за твоего (LPCWSTR) актерского состава. Это просто заткнуло компилятор, говоря вам, что вы сделали что-то не так. Строка по-прежнему не является строкой Unicode и не преобразуется приведением. Исправить:

wcex.lpszClassName = L"MyTitleName";
wndHandle = CreateWindow(
              L"MyTitleName",     //the window class to use
              L"MyTitleName",     //the title bar text
person Hans Passant    schedule 21.01.2010