Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как вытащить коэффициент масштабирования Windows?


Вадим Смоленский

Вопрос

Некоторые юзеры (видимо, из близоруких) прибегают к масштабированию экрана и требуют, чтобы ваше приложение тоже масштабировалось. Когда мой проект был в VCL, я смотрел на параметр Screen.PixelsPerInch и учитывал его значение в своем коде. В FireMonkey этого нет. Я пытался понять, как это делать теперь, и окончательно запутался. Microsoft на официальном сайте упоминает функцию SystemParametersInfo с параметром SPI_GETLOGICALDPIOVERRIDE, но делает оговорку, что такую конфигурацию лучше не использовать - дескать, в новых версиях Windows она не будет работать. Взамен рекомендуют функцию GetScaleFactorForDevice, но тут же заявляют, что под Windows 8 и она работать не будет, а будет работать только GetScaleFactorForMonitor. Голова кругом. Нет ли у кого, случаем, готового решения, которое работало бы на любых Windows - хотя бы от семерки до десятки?

Еще один момент, который я не могу понять - в Windows 10 в настройках экрана, помимо масштаба в процентах, можно выбирать еще и разрешение в пикселях. По-моему, раньше такого разделения не было, хотя могу ошибаться. Связаны ли эти настройки друг с другом? И как они соотносятся со старым добрым DPI?

Изменено пользователем Вадим Смоленский
Ссылка на комментарий

Рекомендуемые сообщения

  • 1

В модуле FMX.Helpers.Win есть две чудные функции:

function GetDCScale(const DC: HDC): Single;
function GetWndScale(const Wnd: HWnd): Single;

причём вторая из них учитывает особенности, начиная с восьмерки.

Изменено пользователем dnekrasov
Ссылка на комментарий
  • 0

Спасибо! Но что все-таки предпочесть, GetWndScale или IFMXScreenService?

Попробовал применить первое, но встал в тупик с константой Wnd. Раньше я получал ее следующим образом:

Wnd := GetWindow(Application.Handle, gw_HWndFirst);

Теперь Delphi ругается на Application.Handle, говорит, что такого свойства нет. Как быть?

А как вставить в код IFMXScreenService с методом GetScreenScale, я и вовсе понять не смог. В хелпах только обрывочная информация об этом, в Сети тоже мало что находится...

Ссылка на комментарий
  • 0
29 минут назад, Вадим Смоленский сказал:

Теперь Delphi ругается на Application.Handle, говорит, что такого свойства нет. Как быть?

FMX.Platform.Win.ApplicationHWND или можете использовать Wnd := GetDesktopWindow

29 минут назад, Вадим Смоленский сказал:

А как вставить в код IFMXScreenService с методом GetScreenScale

function GetScreenScale: Single;
var
  ISS: IFMXScreenService;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, ISS) then
    Exit(ISS.GetScreenScale);

  Result := 1;
end;

 

Изменено пользователем dnekrasov
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...