Dpi

Тема в разделе "Delphi - Система", создана пользователем alexey, 15 сен 2006.

Статус темы:
Закрыта.
  1. alexey

    alexey Гость

    Разрабатываю приложение под стандартные 96 DPI, используется оно в терминале на 120 DPI, в результате ползут надписина кнопках, CheckBox и др.
    Что тут можно сделать?
    Можно ли вообще игнорировать DPI в своем приложении - т.е. убедить его работать при 96, не обращая внимание на системные установки?
    А может можно все-таки убедить Delphi правильно отрисовывать компоненты в соответствии с выставленным DPI?

    Delphi 5 sp1.
     
  2. alexey

    alexey Гость

  3. alexey

    alexey Гость

    Вот такой вариант есть:
    http://www.delphifaq.com/faq/delphi/windows_GUI/f445.shtml.
    Но мне не улыбается перелопачивать сотни компонентов, чтобы всем выставить размер больше, чем уже указано при разработке.
    Да и это установки по умолчанию в общем-то.
     
  4. Barmutik

    Barmutik Гость

    Мы просто все компоненты пересчитывали в рантайме и позиционировали как надо ... проблема конечно очень заморочная...

    Но с другой стороны на пользовательском компе может стоять и не 120 .. а как у нас было 135 dpi... мы выходили только динамическим пересчётом .. другого корректного способа и не нашли ...
     
  5. alexey

    alexey Гость

    Жаль, может и мне так придется делать.....
    А вы вручную пересчитывали с новым размером все подряд?
    Я просто к тому, что если масштабирование формы можно запретить - то шрифты все равно лезут (как бы еще и их масштабирование запретить...).
    Получается надо перемасштабировать только компоненты без шрифтов?
    По идее можно создать процедуру, ей скармливать форму с компонентами и она бы их перемасштабировала с нужным DPI.
    Не подскажете тогда как определить текущий DPI?
     
  6. Barmutik

    Barmutik Гость

    Точно се1час не помню .. вроде бы ... Screen.PixelsPerInch должно помочь...

    Да .. у нас был классик, которому на вход давалась форма и он уже её приводил в нужный вид...

    С этими большими фонтами головной боли вагон . но Микрософт не сертифицирует прогораммы если они корректно не работают с различными размерами шрифтов :(
     
  7. alexey

    alexey Гость

    Хорошо, если напишу - постараюсь скинуть сюда код :(
     
  8. alexey

    alexey Гость

    Наконец-то добрался до проблемы.
    И написал простейший вариант.
    Вот такой вариант ничего не дал для сложных случаев, когда на форме много разных элементов, зато хорошо работает с простыми формами.
    Проблемы 2 - во-первых большие формы - они вылезают за размер экрана. Во-вторых не на все элементы почему-то срабатывает данный подход опять-таки когда на форме много элементов, некоторые остаются прежних размеров (причем сами компоненты стандартные - кнопки и др.).

    У формы Scaled стоит false

    procedure ResizeForm(Form:TForm);
    const
    dpi_base=96;
    var
    c:integer;
    dpi_new:integer;
    k:extended;
    k1:extended;
    ks:extended;
    kp:extended;
    begin
    exit;

    k1:=1.1;
    dpi_new :=Screen.PixelsPerInch;
    k:=dpi_new/dpi_base;
    ks:=k1*k;
    kp:=k1*k;

    Form.Width :=Round(Form.Width *kp);
    Form.Height:=Round(Form.Height*kp);

    for c:=0 to Form.ControlCount-1 do
    begin
    Form.Controls[c].Top :=Round(Form.Controls[c].Top *kp);
    Form.Controls[c].Left :=Round(Form.Controls[c].Left *kp);
    Form.Controls[c].Height:=Round(Form.Controls[c].Height*ks);
    Form.Controls[c].Width :=Round(Form.Controls[c].Width *ks);
    end;
    end;

    Заметил - когда работает стандартная функция при Scaled=True обработка форм при их размере больше размера экрана идет очень точно. Delphi определяет max допустимый размер, после чего масштабирует до него (а не более) и после этого все шрифты также не лезут за допустимые пределы. Если же это почему-то не происходит, то тогда все немного ползет и шрифты слегка не влезают.
     
Статус темы:
Закрыта.

Поделиться этой страницей