Проблема с установкой шрифта в CRichEditView
От: Аноним  
Дата: 16.03.11 14:29
Оценка:
SDI приложение, написанное на VC6.0. Вид унаследован от CRichEditView. На Win7 вдруг вылезла такая ляпа: при установке моноширинного шрифта Courier New отображаемый текст выводится не моноширинным шрифтом. В результате текстовый отчет (таблица) разъезжается. Самое прикольное то, что если открыть текстовый файл отчета блокнотом, то отображение происходит правильно, а вот если wordpad'ом — таблица также разъезжается. На WinXP все, разумеется, работает на ура. Пожскажеите, подалуйста, в чем проблема. Вот код. Заранее спасибо.


void CMainFrame::OnMenuChooseFont() 
{
    // TODO: Add your command handler code here
    CHARFORMAT cf;
    CHARRANGE  cr;

    gPtrView->GetRichEditCtrl().GetSel(cr);
    gPtrView->GetRichEditCtrl().GetSelectionCharFormat(cf);

    CFontDialog dlg(cf);    
    
    if (dlg.DoModal() == IDOK)
    {
        dlg.GetCharFormat(cf);

        gPtrView->GetRichEditCtrl().SetSel(0, -1);
        gPtrView->GetRichEditCtrl().SetDefaultCharFormat(cf);
        gPtrView->GetRichEditCtrl().SetSelectionCharFormat(cf);

        //gPtrView->SendMessage(EM_SETCHARFORMAT, SCF_ALL|SCF_DEFAULT, (LPARAM)&cf);

        gPtrView->GetRichEditCtrl().SetSel(cr);
        gPtrView->SaveCharFormat(cf);

#ifdef _DEBUG
        memset(&cf, 0, sizeof(cf));
        gPtrView->GetRichEditCtrl().GetSelectionCharFormat(cf);
        CString str;
        str.Format("Шрифт %s", cf.szFaceName);
        MessageBox(str);
#endif//_DEBUG
    }
}
Re: Проблема с установкой шрифта в CRichEditView
От: Carc Россия http://www.amlpages.com/home.php
Дата: 16.03.11 21:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>SDI приложение, написанное на VC6.0. Вид унаследован от CRichEditView. На Win7 вдруг вылезла такая ляпа: при установке моноширинного шрифта Courier New отображаемый текст выводится не моноширинным шрифтом. В результате текстовый отчет (таблица) разъезжается. Самое прикольное то, что если открыть текстовый файл отчета блокнотом, то отображение происходит правильно, а вот если wordpad'ом — таблица также разъезжается. На WinXP все, разумеется, работает на ура. Пожскажеите, подалуйста, в чем проблема. Вот код. Заранее спасибо.



А>
А>void CMainFrame::OnMenuChooseFont() 
А>{
А>    // TODO: Add your command handler code here
А>    CHARFORMAT cf;
А>    CHARRANGE  cr;

А>    gPtrView->GetRichEditCtrl().GetSel(cr);
А>    gPtrView->GetRichEditCtrl().GetSelectionCharFormat(cf);

А>    CFontDialog dlg(cf);    
    
А>    if (dlg.DoModal() == IDOK)
А>    {
А>        dlg.GetCharFormat(cf);

А>        gPtrView->GetRichEditCtrl().SetSel(0, -1);
А>        gPtrView->GetRichEditCtrl().SetDefaultCharFormat(cf);
А>        gPtrView->GetRichEditCtrl().SetSelectionCharFormat(cf);

А>        //gPtrView->SendMessage(EM_SETCHARFORMAT, SCF_ALL|SCF_DEFAULT, (LPARAM)&cf);

А>        gPtrView->GetRichEditCtrl().SetSel(cr);
А>        gPtrView->SaveCharFormat(cf);

А>#ifdef _DEBUG
А>        memset(&cf, 0, sizeof(cf));
А>        gPtrView->GetRichEditCtrl().GetSelectionCharFormat(cf);
А>        CString str;
А>        str.Format("Шрифт %s", cf.szFaceName);
А>        MessageBox(str);
А>#endif//_DEBUG
А>    }
А>}
А>


1) Приложение Unicod`ное?
2) Иногда имеет смысл попробовать SendMessage(EM_SETCHARFORMAT) вместо вызова метода. Метод режет размер структуры CHAFORMAT...
3) Что лежит в маске в структуре CHARFORMAT после вызова CFontDialog::GetCharFormat?
4) Пробовали включать опцию EM_SETTEXTMODE + TM_PLAINTEXT? Иногда помогает, но у этой фичи есть и нюансы....
Aml Pages Home
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
От: Carc Россия http://www.amlpages.com/home.php
Дата: 17.03.11 07:35
Оценка:
А>Если вы о бите CFM_FACE, то он установлен. Шрифты реально меняются — это видно. Но Courier New отображается не как равноширинный.
Я о всех остальных битах тоже имел ввиду. Достославная функция CFontDialog::GetCharFormat достаточно много чего вынимает из выбранного шрифта. Что если убрать все маски кроме CFM_FACE + CFM_CHARSET?

А>Прикольно то, что приложение SimpleWordPad, скачанное в исходниках с codeproject ведет себя таким же образом как моё. Возможна ли какая-то лажа со шрифтами в самой ОС?

Ну вообще говоря, иногда начинаются танцы с бубнами вокруг ClearType сглаживания. Бывало, накушался неприятных эффектов. Но в моем случае трабла и вовсе в другом была. Но я так и не нашел документированного способа отключить ClearType для конкретного HDC... Так что конкретно вряд ли что подскажу в этом моменте, но покопать в эту сторону заради хотя бы эксперимента можно.
+ можно и скриншот поплывшего отчета выложить. На глаз может оно понятнее станет в чем возможен источник проблемы.
Aml Pages Home
Re[4]: Проблема с установкой шрифта в CRichEditView
От: kaaaaa  
Дата: 17.03.11 09:00
Оценка:
Здравствуйте, Carc, Вы писали:

C>Что если убрать все маски кроме CFM_FACE + CFM_CHARSET?

Все то же самое.

C>можно и скриншот поплывшего отчета выложить. На глаз может оно понятнее станет в чем возможен источник проблемы.

Ага, попробую, если разберусь как цеплять картинки.

Отчет при отображении шрифтом Lucida Console — все ровненько.

Содержимое маски при смене шрифта на Courier New

Разъехавшийся отчет

Содержимое маски при принудительной установке маски в (CFM_FACE + CFM_CHARSET). В результате получается то, что на 3-ей картинке.
Re: Проблема с установкой шрифта в CRichEditView
От: okman Беларусь https://searchinform.ru/
Дата: 17.03.11 09:05
Оценка:
Здравствуйте, Аноним.

Попробуйте перед установкой шрифта отправить Rich Edit-у сообщение EM_SETLANGOPTIONS — там
можно сбросить некоторые флаги типа IMF_AUTOFONT. Хотя не уверен, поможет или нет.
Re[2]: Проблема с установкой шрифта в CRichEditView
От: Carc Россия http://www.amlpages.com/home.php
Дата: 17.03.11 09:42
Оценка:
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Аноним.


O>Попробуйте перед установкой шрифта отправить Rich Edit-у сообщение EM_SETLANGOPTIONS — там

O>можно сбросить некоторые флаги типа IMF_AUTOFONT. Хотя не уверен, поможет или нет.
EM_SETLANGOPTIONS поддерживается только версиями RichEdit 2.00 и выше, а у парня вроде как 1.0 используется...
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.