Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Масштабирование размера формы и размера шрифтов

Delphi , Графика и Игры , Шрифты

Масштабирование размера формы и размера шрифтов

Когда мои программы работают на системах с установленными маленькими шрифтами, я получаю странный вид моей формы. К примеру, расположенные на форме компоненты Label становятся малы для размещения указанного теста, обрезая его в правой или нижней части. StringGrid не осуществляет положенного выравнивания и т.д.

Попробуй следующий код. Он масштабирует как размер формы, так и размер шрифтов. Вызывай его в Form.FormCreate. Надеюсь это поможет.


unit geScale;

interface
uses Forms, Controls;

procedure geAutoScale(MForm: TForm);

implementation
type
  TFooClass = class(TControl); { необходимо выяснить защищенность }

  { свойства Font }

procedure geAutoScale(MForm: TForm);
const

  cScreenWidth: integer = 800;
  cScreenHeight: integer = 600;
  cPixelsPerInch: integer = 96;
  cFontHeight: integer = -11; {В режиме проектирование значение из Font.Height}

var

  i: integer;

begin

  {
  ВАЖНО!! : Установите в Инспекторе Объектов свойство Scaled TForm в FALSE.

  Следующая программа масштабирует форму так, чтобы она выглядела одинаково
  внезависимости от размера экрана и пикселей на дюйм. Расположенный ниже
  участок кода проверяет, отличается ли размер экрана во время выполнения
  от размера во время проектирования. Если да, Scaled устанавливается в True
  и компоненты снова масштабируются так, чтобы они выводились в той же
  позиции экрана, что и во время проектирования.
  }
  if (Screen.width &; lt > cScreenWidth) or (Screen.PixelsPerInch <>
    cPixelsPerInch) then
  begin
    MForm.scaled := TRUE;
    MForm.height := MForm.height * screen.Height div cScreenHeight;
    MForm.width := MForm.width * screen.width div cScreenWidth;
    MForm.ScaleBy(screen.width, cScreenWidth);

  end;

  {
  Этот код проверяет, отличается ли размер шрифта во времы выполнения от
  размера во время проектирования. Если во время выполнения pixelsperinch
  формы отличается от pixelsperinch во время проектирования, шрифты снова
  масштабируются так, чтобы форма не отличалась от той, которая была во
  время разработки. Масштабирование производится исходя из коэффициента,
  получаемого путем деления значения font.height во время проектирования
  на font.height во время выполнения. Font.size в этом случае работать не
  будет, так как это может дать результат больший, чем текущие размеры
  компонентов, при этом текст может оказаться за границами области компонента.
  Например, форма создана при размерах экрана 800x600 с установленными
  маленькими шрифтами, имеющими размер font.size = 8. Когда вы запускаете
  в системе с 800x600 и большими шрифтами, font.size также будет равен 8,
  но текст будет бОльшим чем при работе в системе с маленькими шрифтами.
  Данное масштабирование позволяет иметь один и тот же размер шрифтов
  при различных установках системы.
  }

  if (Screen.PixelsPerInch <> cPixelsPerInch) then
  begin

    for i := MForm.ControlCount - 1 downto 0 do
      TFooClass(MForm.Controls[i]).Font.Height :=
        (MForm.Font.Height div cFontHeight) *
        TFooClass(MForm.Controls[i]).Font.Height;

  end;

end;

end.

Код предназначен для масштабирования размера формы и ее контролов в зависимости от разрешения экрана и размеров шрифта. Идея заключается в том, чтобы форма выглядела одинаково на различных разрешениях экрана и размерах шрифта при проектировании и выполнении.

Процедура geAutoScale принимает объект TForm как входной параметр, который является основным окном вашей приложения. Она проверяет, изменилось ли разрешение экрана или плотность пикселей с момента проектирования, и если да, то масштабирует форму и ее контролов соответственно.

Вот шаг за шагом, что код делает:

  1. Сначала она проверяет, отличается ли ширина или высота экрана от значений проектирования (800x600 пикселей). Если они отличаются, то она устанавливает свойство MForm.Scaled в True, что триггерует процесс масштабирования.
  2. Высота и ширина формы изменяются на основе отношения текущего разрешения экрана к значениям проектирования.
  3. Метод ScaleBy вызывается для масштабирования всех контролов, включая метки, кнопки и т.д., внутри формы.

Вторая часть кода проверяет, изменилось ли размер шрифта с момента проектирования. Если да, то она масштабирует размеры шрифта всех контролов на форме на основе коэффициента, рассчитанного путем деления высоты шрифта проектирования на высоту шрифта выполнения.

Вот несколько предложений:

  • Вместо использования жестко закодированных значений проектирования (800x600 пикселей), вы можете хранить их в файле конфигурации или модуле констант для более простой поддержки.
  • Вы может хотеть рассмотреть использование более robust алгоритма масштабирования, который учитывает соотношение сторон экрана, а не только ширина и высота.
  • Код предполагает, что все контролы являются экземплярами TControl, но если у вас есть пользовательские контролы, которые не наследуются от TControl, вам нужно будет изменить код соответствующим образом.

В целом, это хороший старт для реализации масштабирования формы в вашем приложении. Однако вы может хотеть фильтровать код в зависимости от своих конкретных требований и результатов тестирования.

Масштабирование размера формы и размера шрифтов на разных системах с установленными маленькими или большими шрифтами.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Шрифты ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:45:37/0.0036220550537109/0