Текст в Юникоде отображается как вопросительные знаки в окне редактирования, хотя я использую SetWindowTextW () - PullRequest
3 голосов
/ 14 февраля 2011

У меня проблема с именами файлов Unicode, которые отображаются в виде вопросительных знаков в полях редактирования.

Когда я вставляю символы Unicode в поле редактирования, например, арабский или тайский, они отображаются правильно, но после запуска этогокод, они становятся вопросительными знаками.Почему?

WCHAR buf[100];
GetWindowTextW(hWndEditBox, buf, 100);
SetWindowTextW(hWndEditBox, buf);

Другое дело - проект представляет собой ANSI (у нас есть код, который нельзя перенести, поэтому весь проект остается ANSI), то есть макрос _UNICODE не определен, но я явно использую версии Unicodeимен файлов.

Ответы [ 2 ]

2 голосов
/ 14 февраля 2011

Функция GetWindowText фактически отправляет в окно сообщение WM_GETTEXT (hWndEditBox).Поскольку вы используете функции *A вместо функции *W (в данном случае, в частности, CreateWindowExA), ваш цикл обработки сообщений будет преобразовываться из широких символов в многобайтовые символы с использованием некоторой локали.

Ваше единственное решение здесь, по-видимому, заключается в изменении всей настройки окна - если ваш код, который требует ANSI, не связан с пользовательским интерфейсом, это должно быть возможно.Кроме того, вы можете заменить поле редактирования расширенными полями редактирования, которые предоставляют дополнительные сообщения (например, streaming ).

Возможно, вы захотите проверить, является ли этоGetWindowTextW вызов или SetWindowTextW вызов, который выполняет неправильное преобразование - если GetWindowTextW работает правильно, вы можете преобразовать в многобайтовый формат, используя правильный языковой стандарт, прежде чем его установить.

Наконец, вы можетепопробуйте настроить кодовую страницу потока перед чтением текста, хотя это может вызвать другие проблемы.Обычный совет - использовать Unicode.

Источники: GetWindowText и этот комментарий от Рэймонда Чена в его блоге.

0 голосов
/ 20 декабря 2014

Полезный ответ на адрес SetWindowTextW() дается в https://stackoverflow.com/a/11515400/1190077: перехватить полученное сообщение WM_SETTEXT и перенаправить его на DefWindowProcW() вместо DefWindowProc().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...