Страница 1 из 1

Внутренний шрифт в плагинах/утилитах...

Добавлено: Пн июл 10, 2006 09:59
Maximus
Узнал вот о проблемах отображения шрифтов у забугорных пользователей:
http://www.ghisler.ch/board/viewtopic.php?t=4858
Общий смысл я уловил, но всё равно хотелось бы попросить владеющих английским лучше меня перевести содержимое указанной темы, поскольку это актуально для тех, кто пишет плагины/утилиты с мультиязычным интерфейсом и заботится о соих пользователях :)

Добавлено: Пн июл 10, 2006 10:08
CaptainFlint
Если вкратце: многие используют конкретный фиксированный шрифт в своих диалогах, типа MS Sans Serif. Это плохо тем, что в нём нет многих полезных символов, что мешает локализовывать программу. Предлагается использовать Arial Latin или Tahoma Latin, 8, normal, а ещё лучше - дать пользователю возможность самому выбирать шрифт.
Где-то ещё Clo писал о шрифте MS Shell Dlg, который хорош тем, что сам по себе является "виртуальным", ненастоящим шрифтом, а настраивается через глобальные системные настройки; в результате у пользователя все программы выглядят одинаково (если они, конечно, используют этот шрифт).

Добавлено: Пн июл 10, 2006 10:14
Maximus
А во втором сообщении темы. Там о другой проблеме или всё о той же?

Добавлено: Пн июл 10, 2006 10:44
CaptainFlint
Там он рассуждает, что можно использовать всякие спец-символы внутри текстовых LNG-файлов (например, писать "кривой" апостроф явно вместо задания его через десятичный код; не указывать бэк-слеш перед внутренними кавычками).

Добавлено: Пн июл 10, 2006 11:00
Maximus
Спасибо.
А как же организовать выбор шрифта (как в ТС), чтобы быстро и красиво?

Добавлено: Пн июл 10, 2006 15:15
CaptainFlint
Не совсем понял вопрос. К какой части интерфейса относится фраза "как же организовать выбор шрифта"? К собственно диалогу выбора? К кнопочкам для вызова этого диалога? К отображаемому рядом с кнопочкой примеру текста в выбранном шрифта?..
Если первое, то есть стандартная WinAPI-функция ChooseFont для вызова этого самого диалога, а в зависимости от среды программирования есть и разнообразные обёртки для этой функции.

Добавлено: Пн июл 10, 2006 16:00
Maximus
Я имел в виду совсем другое. Как разом для всех компонентов формы поменять этот самый шрифт. Но уже справился.

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

    fdFont->Font=fmMain->Font;
    if(fdFont->Execute())
    {
        fmMain->Font=fdFont->Font;
        fmMain->Repaint();
    }
Но небольшая проблема всё равно осталась. Панели, ГроупБоксы, СкроллБары, может ещё что-то не перерисовываются. Что делать?

Добавлено: Чт июл 13, 2006 10:54
Maximus
Решил проблему так:

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

    fdFont->Font=fmMain->Font;
    if(fdFont->Execute())
    {
        fmMain->Font=fdFont->Font;
        for(int i=0;i<fmMain->ComponentCount;i++)
        {
            TControl *Component=(TControl *)fmMain->Components[i];
            if(Component->HasParent() && !Component->ClassNameIs("TMenuItem"))
                Component->Repaint();
        }
    }
Подразумевается, что у всех компонентов ParentFont==true.
fdFont - это FontDialog; fmMain - это форма.
Возможно кроме TMenuItem в условии придется добавить еще какие-то классы, если они используются и при вызове для них Repaint() вываливается ошибка.