SDI приложение, написанное на VC6.0. Вид унаследован от CRichEditView. На Win7 вдруг вылезла такая ляпа: при установке моноширинного шрифта Courier New отображаемый текст выводится не моноширинным шрифтом. В результате текстовый отчет (таблица) разъезжается. Самое прикольное то, что если открыть текстовый файл отчета блокнотом, то отображение происходит правильно, а вот если wordpad'ом — таблица также разъезжается. На WinXP все, разумеется, работает на ура. Пожскажеите, подалуйста, в чем проблема. Вот код. Заранее спасибо.
Здравствуйте, Аноним, Вы писали:
А>SDI приложение, написанное на VC6.0. Вид унаследован от CRichEditView. На Win7 вдруг вылезла такая ляпа: при установке моноширинного шрифта Courier New отображаемый текст выводится не моноширинным шрифтом. В результате текстовый отчет (таблица) разъезжается. Самое прикольное то, что если открыть текстовый файл отчета блокнотом, то отображение происходит правильно, а вот если wordpad'ом — таблица также разъезжается. На WinXP все, разумеется, работает на ура. Пожскажеите, подалуйста, в чем проблема. Вот код. Заранее спасибо.
1) Приложение Unicod`ное?
2) Иногда имеет смысл попробовать SendMessage(EM_SETCHARFORMAT) вместо вызова метода. Метод режет размер структуры CHAFORMAT...
3) Что лежит в маске в структуре CHARFORMAT после вызова CFontDialog::GetCharFormat?
4) Пробовали включать опцию EM_SETTEXTMODE + TM_PLAINTEXT? Иногда помогает, но у этой фичи есть и нюансы....
Re[2]: Проблема с установкой шрифта в CRichEditView
От:
Аноним
Дата:
17.03.11 06:16
Оценка:
Здравствуйте, Carc, Вы писали:
C>1) Приложение Unicod`ное?
Нет C>2) Иногда имеет смысл попробовать SendMessage(EM_SETCHARFORMAT) вместо вызова метода. Метод режет размер структуры CHAFORMAT...
Пробовал. Обратите внимание на закомментированную строчку. C>3) Что лежит в маске в структуре CHARFORMAT после вызова CFontDialog::GetCharFormat?
Если вы о бите CFM_FACE, то он установлен. Шрифты реально меняются — это видно. Но Courier New отображается не как равноширинный. C>4) Пробовали включать опцию EM_SETTEXTMODE + TM_PLAINTEXT? Иногда помогает, но у этой фичи есть и нюансы....
Не пробовал.
Прикольно то, что приложение SimpleWordPad, скачанное в исходниках с codeproject ведет себя таким же образом как моё. Возможна ли какая-то лажа со шрифтами в самой ОС?
Re[3]: Проблема с установкой шрифта в CRichEditView
А>Если вы о бите CFM_FACE, то он установлен. Шрифты реально меняются — это видно. Но Courier New отображается не как равноширинный.
Я о всех остальных битах тоже имел ввиду. Достославная функция CFontDialog::GetCharFormat достаточно много чего вынимает из выбранного шрифта. Что если убрать все маски кроме CFM_FACE + CFM_CHARSET?
А>Прикольно то, что приложение SimpleWordPad, скачанное в исходниках с codeproject ведет себя таким же образом как моё. Возможна ли какая-то лажа со шрифтами в самой ОС?
Ну вообще говоря, иногда начинаются танцы с бубнами вокруг ClearType сглаживания. Бывало, накушался неприятных эффектов. Но в моем случае трабла и вовсе в другом была. Но я так и не нашел документированного способа отключить ClearType для конкретного HDC... Так что конкретно вряд ли что подскажу в этом моменте, но покопать в эту сторону заради хотя бы эксперимента можно.
+ можно и скриншот поплывшего отчета выложить. На глаз может оно понятнее станет в чем возможен источник проблемы.
Здравствуйте, Carc, Вы писали:
C>Что если убрать все маски кроме CFM_FACE + CFM_CHARSET?
Все то же самое.
C>можно и скриншот поплывшего отчета выложить. На глаз может оно понятнее станет в чем возможен источник проблемы.
Ага, попробую, если разберусь как цеплять картинки.
Отчет при отображении шрифтом Lucida Console — все ровненько.
Содержимое маски при смене шрифта на Courier New
Разъехавшийся отчет
Содержимое маски при принудительной установке маски в (CFM_FACE + CFM_CHARSET). В результате получается то, что на 3-ей картинке.
Попробуйте перед установкой шрифта отправить Rich Edit-у сообщение EM_SETLANGOPTIONS — там
можно сбросить некоторые флаги типа IMF_AUTOFONT. Хотя не уверен, поможет или нет.
Re[2]: Проблема с установкой шрифта в CRichEditView
Здравствуйте, okman, Вы писали:
O>Здравствуйте, Аноним.
O>Попробуйте перед установкой шрифта отправить Rich Edit-у сообщение EM_SETLANGOPTIONS — там O>можно сбросить некоторые флаги типа IMF_AUTOFONT. Хотя не уверен, поможет или нет.
EM_SETLANGOPTIONS поддерживается только версиями RichEdit 2.00 и выше, а у парня вроде как 1.0 используется...