Dpi

  • Автор темы alexey
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

alexey

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

Delphi 5 sp1.
 
A

alexey

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

Barmutik

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

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

alexey

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

Barmutik

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

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

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

alexey

Гость
#7
Хорошо, если напишу - постараюсь скинуть сюда код :(
 
A

alexey

Гость
#8
Наконец-то добрался до проблемы.
И написал простейший вариант.
Вот такой вариант ничего не дал для сложных случаев, когда на форме много разных элементов, зато хорошо работает с простыми формами.
Проблемы 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 допустимый размер, после чего масштабирует до него (а не более) и после этого все шрифты также не лезут за допустимые пределы. Если же это почему-то не происходит, то тогда все немного ползет и шрифты слегка не влезают.
 
Статус
Закрыто для дальнейших ответов.