#visual-c #mfc
#visual-c #mfc
Вопрос:
Этот код отображает приветствие на китайском
char buffer[10]="hello";
AfxMessageBox((LPCTSTR)buffer);
в то время как этот код отображает его на английском
AfxMessageBox(L"hello");
Может кто-нибудь сказать мне, как мне правильно ввести приведенную переменную buffer, если это проблема в моем коде
Ответ №1:
Тип LPCTSTR представляет собой длинный указатель на прозрачную строку. Что здесь важно, так это T, прозрачный (по крайней мере, я думаю, что T означает прозрачный).
Если ваше приложение скомпилировано как приложение ASCII, все типы T (например, TCHAR) переопределяются как их аналог ASCII. Таким образом, TCHAR станет просто символом.
Если ваше приложение скомпилировано в формате Unicode, все типы T переопределяются как типы Unicode. TCHAR становится wchar_t .
То же самое верно для всех функций Windows (и MFC). Все функции Windows представлены в двух вариантах: версии ASCII (например, MessageBoxA) и версии Unicode (например, MessageBoxW). Сам MessageBox — это не что иное, как определение либо MessageBoxA, либо MessageBoxW (в зависимости от того, как вы компилируете).
В вашем примере buffer определен как тип char-vector, но вы преобразуете его в указатель на прозрачный тип. Я предполагаю, что ваше приложение скомпилировано в Юникоде, поэтому LPCTSTR на самом деле является «wchar_t *». Итак, это приведение неверно.
Добавление к строке «hello» символа L указывает компилятору присвоить константе «hello» значение строки в Юникоде, что делает ее правильным типом для передачи в версию AfxMessageBox в Юникоде.
Ответ №2:
Если у вас есть флаг _UNICODE
и UNICODE
, определенный в настройках вашего компилятора, то приведение строки LPCTSTR
будет обрабатывать строку как строку Unicode. В случае Windows он будет обрабатывать каждые 16 байт как один символ и попытается найти соответствующий символ Юникода. Чтобы заставить его отображать английские символы, используйте TCHAR
при определении массива.