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

Только для тех, кто пишет плагины под Total Commander. Обмен опытом, решение проблем.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

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

Сообщение Maximus »

Узнал вот о проблемах отображения шрифтов у забугорных пользователей:
http://www.ghisler.ch/board/viewtopic.php?t=4858
Общий смысл я уловил, но всё равно хотелось бы попросить владеющих английским лучше меня перевести содержимое указанной темы, поскольку это актуально для тех, кто пишет плагины/утилиты с мультиязычным интерфейсом и заботится о соих пользователях :)
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

Если вкратце: многие используют конкретный фиксированный шрифт в своих диалогах, типа MS Sans Serif. Это плохо тем, что в нём нет многих полезных символов, что мешает локализовывать программу. Предлагается использовать Arial Latin или Tahoma Latin, 8, normal, а ещё лучше - дать пользователю возможность самому выбирать шрифт.
Где-то ещё Clo писал о шрифте MS Shell Dlg, который хорош тем, что сам по себе является "виртуальным", ненастоящим шрифтом, а настраивается через глобальные системные настройки; в результате у пользователя все программы выглядят одинаково (если они, конечно, используют этот шрифт).
Почему же, ё-моё, ты нигде не пишешь "ё"?
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Сообщение Maximus »

А во втором сообщении темы. Там о другой проблеме или всё о той же?
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

Там он рассуждает, что можно использовать всякие спец-символы внутри текстовых LNG-файлов (например, писать "кривой" апостроф явно вместо задания его через десятичный код; не указывать бэк-слеш перед внутренними кавычками).
Почему же, ё-моё, ты нигде не пишешь "ё"?
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Сообщение Maximus »

Спасибо.
А как же организовать выбор шрифта (как в ТС), чтобы быстро и красиво?
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

Не совсем понял вопрос. К какой части интерфейса относится фраза "как же организовать выбор шрифта"? К собственно диалогу выбора? К кнопочкам для вызова этого диалога? К отображаемому рядом с кнопочкой примеру текста в выбранном шрифта?..
Если первое, то есть стандартная WinAPI-функция ChooseFont для вызова этого самого диалога, а в зависимости от среды программирования есть и разнообразные обёртки для этой функции.
Почему же, ё-моё, ты нигде не пишешь "ё"?
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Сообщение Maximus »

Я имел в виду совсем другое. Как разом для всех компонентов формы поменять этот самый шрифт. Но уже справился.

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

    fdFont->Font=fmMain->Font;
    if(fdFont->Execute())
    {
        fmMain->Font=fdFont->Font;
        fmMain->Repaint();
    }
Но небольшая проблема всё равно осталась. Панели, ГроупБоксы, СкроллБары, может ещё что-то не перерисовываются. Что делать?
Аватара пользователя
Maximus
Сообщения: 927
Зарегистрирован: Чт апр 07, 2005 10:51
Откуда: Украина, Кировоградская обл., г. Знаменка
Контактная информация:

Сообщение 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() вываливается ошибка.
Ответить