Создание приложения Win32 Window с английской строкой заголовка, но строка заголовка становится китайской из ниоткуда. Как так? - PullRequest
3 голосов
/ 21 января 2010
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 Window. Приведенный выше код используется для установки названия строки заголовка экрана окна. Компилятор кричит мне: «не могу преобразовать из« const char [12] »в« LPCWSTR », так что все в порядке, я напечатал строку MyTitleName с помощью (LPCWSTR), и все скомпилировалось просто отлично. Однако во время выполнения заголовок экрана окна оказывается китайскими иероглифами. Я попытался изменить строку, и китайские символы всегда меняются в зависимости от моей строки. Я использую XP Visual C ++ 2008 Express Edition, и я получил английский (США) в качестве настройки для не-Unicode программ. Я не понимаю Как получилось, что струна стала китайской?

Ответы [ 2 ]

9 голосов
/ 21 января 2010

Ваше приложение компилируется как приложение Unicode (это определяется в настройках проекта). Это означает, что строки, передаваемые в функции Windows API, должны быть строками с широкими символами, указанными так: 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. Не делайте этого для любой программы, которая может когда-нибудь поддерживать другие языки.

7 голосов
/ 21 января 2010

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

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