Хвалёный Уникод не работает

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

programisto писал(а): съедает значок над буквой. Тот же фонт при помощи TextOutW выводится правильно.
Для комбобокса: возможно размер шрифта больше размера айтема комбобокса - происходит затирание части текста соседним айтемом.
programisto
Сообщения: 12
Зарегистрирован: 11 авг 2009, 16:24

Albor писал(а):Для комбобокса: возможно размер шрифта больше размера айтема комбобокса - происходит затирание части текста соседним айтемом.
He похоже. Заглавные буквы не обрезает.

B Richedit тоже неправильно показывает Уникод.

У меня впечатление - Уникод работает только в TextOut
programisto
Сообщения: 12
Зарегистрирован: 11 авг 2009, 16:24

Decoder писал(а):Наверно caм что-то делаешь неправильно.
Вот что накопал в Инете:

Обратите внимание, что стандартные компоненты не могут работать с юникод строками! Правильно отображать UNICODE строки, даже после всех необходимых перекодировок, могут

•только контролы, которые написаны специальным образом,
•контролы с установленными UNICODE шрифтами.

Но подробнее ничего нет.
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Честно говоря, у меня вызывает сомнение надёжность такого источника информации. Возможно подобное утверждение было актуально для Windows 95/98.
Достаточно открыть MSDN и найти там справку по сообщению CB_ADDSTRING.
Вoт как описываются параметры функции SendMessage для данного сообщения:

Код: Выделить всё

[size=84]lResult = SendMessage( [/size][size=84]  // returns LRESULT in lResult [/size]
[size=84](HWND) hWndControl, [/size][size=84]  // handle to destination control [/size]
[size=84](UINT) CB_ADDSTRING, [/size][size=84]  // message ID [/size]
[size=84](WPARAM) wParam, [/size][size=84]  // = 0; not used, must be zero[/size]
[size=84](LPARAM) lParam [/size][size=84]  // = (LPARAM) (LPCTSTR) lParam;[/size]
[size=84]);[/size] 
Тип LPCTSTR говорит о том, что строка может передаваться как в кодировке ANSI, так и в UNICODE, в зависимости от текущих настроек проекта.
Поумнеть несложно, куда труднее от дури избавиться.
programisto
Сообщения: 12
Зарегистрирован: 11 авг 2009, 16:24

Decoder писал(а):Честно говоря, у меня вызывает сомнение надёжность такого источника информации. Возможно подобное утверждение было актуально для Windows 95/98.
Достаточно открыть MSDN и найти там справку по сообщению CB_ADDSTRING.
Вoт как описываются параметры функции SendMessage для данного сообщения:

Код: Выделить всё

[size=84]lResult = SendMessage( [/size][size=84]  // returns LRESULT in lResult [/size]
[size=84](HWND) hWndControl, [/size][size=84]  // handle to destination control [/size]
[size=84](UINT) CB_ADDSTRING, [/size][size=84]  // message ID [/size]
[size=84](WPARAM) wParam, [/size][size=84]  // = 0; not used, must be zero[/size]
[size=84](LPARAM) lParam [/size][size=84]  // = (LPARAM) (LPCTSTR) lParam;[/size]
[size=84]);[/size] 
Тип LPCTSTR говорит о том, что строка может передаваться как в кодировке ANSI, так и в UNICODE, в зависимости от текущих настроек проекта.
Проблема для Richedit решена. Ошибка была в том, что для Richedit была определена оконная процедура. После удаления оконной процедуры всё заработало как нужно. Решение подсказали на венгерском форуме.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

programisto писал(а):Проблема для Richedit решена. Ошибка была в том, что для Richedit была определена оконная процедура. После удаления оконной процедуры всё заработало как нужно. Решение подсказали на венгерском форуме.
Не очень понятно. Можно поподробнее? Что значит "была определена" и "удалена"? Ведь у каждого окна существует обработчик событий, т.е. "оконная процедура". Как же без нее?
programisto
Сообщения: 12
Зарегистрирован: 11 авг 2009, 16:24

Я не вполне корректно выразился, была определена процедура редактирования следующим образом:

SetWindowLong(hWndRichEdit,GWL_WNDPROC, pEditProc);

После удаления этого вызова Уникод в RichEdit отображается правильно (при выполнении некоторых условий, которые названы в предыдущих постах).

EditProc ничего существенного не выполняла, я её безболезненно удалил.
Ответить