Поддержка DPI Windows в Lazarus

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Поддержка DPI Windows в Lazarus

Сообщение max » 03.03.2019 12:54:41

Доброе время суток.

В параметрах проекта, есть выбор из пяти вариантов, но корректно работает только первый (Win 10 / Laz 2.0).
Суть проблемы в следующем. Программа берёт высоту экрана из переменных: Screen.Width и Screen.Height. Когда один монитор, то всё хорошо. А когда два монитора, то начинаются проблемы, т.к. по умолчанию возвращается значение монитора №1. При этом если сменить "Поддержку DPI" на Vista + 8.1|10, то начинает работать правильно, и брать высоту монитора, в котором раскрыта программа. Однако в таком положении "Поддержки DPI" -- рушится остальной интерфейс.

В общем суть вопроса, в том, можно ли как-то получить высоту именно активного монитора (из двух или больше), когда установлены параметры проекта лазаруса, такие, как на картинке? (нужны именно такие параметры, т.к. при остальных рушится интерфейс)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
max
 

Re: Поддержка DPI Windows в Lazarus

Сообщение Лекс Айрин » 03.03.2019 13:12:36

max, ну ты же сам сказал "при значениях по умолчанию". Проверь значение разрешения для активного монитора просто запросив какой из них для окна активный.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Поддержка DPI Windows в Lazarus

Сообщение max » 03.03.2019 13:23:27

Лекс Айрин писал(а):просто запросив какой из них для окна активный

Иииии? Как это сделать?
max
 

Re: Поддержка DPI Windows в Lazarus

Сообщение Лекс Айрин » 03.03.2019 13:30:53

maxтут не могу сказать, так как просто нет под рукой компа. Но я точно помню, что есть переменная типа monitor.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Поддержка DPI Windows в Lazarus

Сообщение Vadim » 03.03.2019 13:35:50

max
Можно вручную указать номер монитора:
Код: Выделить всё
Screen.Monitors[Его_Номер].Width
Screen.Monitors[Его_Номер].Height

Как определить именно текущий монитор сходу сказать не могу, никогда такой задачи не стояло. Если что-нибудь нарою и другие тут не напишут, то скину сюда...

Добавлено спустя 12 минут 33 секунды:
А вот, кстати, если мониторы не дублируют друг друга, то их можно вообще не различать - они тогда образуют одно экранное пространство.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Поддержка DPI Windows в Lazarus

Сообщение max » 03.03.2019 13:52:48

Vadim писал(а):то их можно вообще не различать - они тогда образуют одно экранное пространство.

Нет. Там всё хитрее, у каждого монитора свои DPI и + разный размер экрана и поэтому -- разница 100% есть.

Лекс Айрин писал(а):monitor

Работает, спасибо.
PS: Называется: (FormMain).Monitor.Width + (FormMain).Monitor.Height и оно как ни странно 100% правильно возвращает размер монитора, в котором окно программы.
Тему можно закрывать.
max
 

Re: Поддержка DPI Windows в Lazarus

Сообщение Лекс Айрин » 03.03.2019 23:41:18

max, да не за что. Рад, что помогло.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Поддержка DPI Windows в Lazarus

Сообщение zoltanleo » 05.03.2019 02:11:00

max писал(а):Тему можно закрывать.


Там вообще много интересного:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  Self.Caption:= 'TMonitor';
  with Memo1.Lines do
  begin
    Clear;
    Add('TMonitor properties:');
    Add('================');
    Add(Format('Handle: %d (hint: %s)',[Self.Monitor.Handle, 'Identifies this monitor to the system. ']));
    Add(Format('MonitorNum: %d (hint: %s)',[Self.Monitor.MonitorNum, 'Index of the monitor in the TScreen.Monitors list.']));
    Add(Format('Left: %d (hint: %s)',[Self.Monitor.Left,'The leftmost screen coordinate of the display.']));
    Add(Format('Height: %d (hint: %s)',[Self.Monitor.Height,'The height of the display.']));
    Add(Format('Top: %d (hint: %s)',[Self.Monitor.Top,'The topmost screen coordinate of the display.']));
    Add(Format('Width: %d (hint: %s)',[Self.Monitor.Width,'The width of the display.']));
    Add(Format('BoundsRect: Rect(%d,%d,%d,%d) (hint: %s)',
    [Self.Monitor.BoundsRect.Left,
    Self.Monitor.BoundsRect.Top,
    Self.Monitor.BoundsRect.Width,
    Self.Monitor.BoundsRect.Height,
    'The logical dimensions of the monitor, within the desktop.']));
    Add(Format('WorkareaRect: Rect(%d,%d,%d,%d) (hint: %s)',
    [Self.Monitor.WorkareaRect.Left,
    Self.Monitor.WorkareaRect.Top,
    Self.Monitor.WorkareaRect.Width,
    Self.Monitor.WorkareaRect.Height,
    'The usable display area, excluding a taskbar etc.']));
    Add(Format('Primary: %s (hint: %s)',[BoolToStr(Self.Monitor.Primary,'True','False'),
    'True if this is the primary monitor of the system.']));
    Add(Format('PixelsPerInch: %d (hint: %s)',[Self.Monitor.PixelsPerInch,'Current PPI Monitor.']));
  end;
end;


Я себе сохранил на память.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
zoltanleo
постоялец
 
Сообщения: 457
Зарегистрирован: 17.10.2013 10:55:01


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

Рейтинг@Mail.ru