powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / масштаб экрана Win 10
10 сообщений из 10, страница 1 из 1
масштаб экрана Win 10
    #40092774
SilverShield
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Пытаюсь в Delphi XE7 получить настоящий масштаб экрана. Пробовал через Screen.PixelsPerInch, но оно всегда одинаковое возвращается.

Речь НЕ про разрешение, а именно масштаб. Который задается в процентах, отдельно от разрешения. Особенно часто на ноутбуках может отличаться от 100%. Например разрешение 1600 на 900 и масштаб 150%.

При этом на одном из ноутов получаю такую картину:
для масштаба 125%:
что Screen.Width, что GetDeviceCaps(GetDC(0),HORZRES = 1093.
что Screen.Height, что GetDeviceCaps(GetDC(0),VERTRES = 614.
PixelsPerInch = 96 и GetDeviceCaps(GetDC(0),LOGPIXELSX) = 96.

Для масштаба 100%:
что Screen.Width, что GetDeviceCaps(GetDC(0),HORZRES = 1366.
что Screen.Height, что GetDeviceCaps(GetDC(0),VERTRES = 768.
PixelsPerInch = 96 и GetDeviceCaps(GetDC(0),LOGPIXELSX) = 96.


Т.е. с увеличением масштаба размеры экрана уменьшаются. Количество пикселей при этом всегда 96 возвращается...
Как определить настоящий масштаб?
...
Рейтинг: 0 / 0
масштаб экрана Win 10
    #40092783
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SilverShieldКак определить настоящий масштаб?

Попробуй выставить "high dpi aware" в свойствах приложения.
Или в системе отключить "помощь приложениям с масштабированием" в продвинутых
настройках.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
масштаб экрана Win 10
    #40092788
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SilverShield,


В XE7 насколько помню не было поддержки hiDPI.
Без включенного dpiaware манифеста, приложение запускается в режиме виртуализации и часть функций всегда будет возвращать dpi = 96. Можно взять реальное разрешение, к примеру через EnumDisplaySettings и виртуальное через GetDeviceCaps/GetSystemMetrics.
Разделив реальное на виртуальное, можно получить фактор соотношения, который можно умножить на 96.
На MS есть немного инфы, но смотрю, часть про виртуализацию уже почему-то зарубили.
...
Рейтинг: 0 / 0
масштаб экрана Win 10
    #40092790
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Den_Z_В XE7 насколько помню не было поддержки hiDPI.
Без включенного dpiaware манифеста

А это не одно и то же?.. VCL как бы изначально DPI-aware, осталось только это
сообщить винде.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
масштаб экрана Win 10
    #40092794
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Не совсем. D7 тоже умеет скалить контролы, но даже с манифестом она нормально не заработает без напильника.
Тот же WM_DPICHANGED XE7 не обрабатывает, который будет приходить с Per-Monitorv2 режимом.
Полная обработка всех режимов появилась с 10-й версии(и то не все работало).

Проще говоря если не готов отлавливать кастомные отрисвки, которые скорее всего поплывут в dpiaware режиме. Лучше оставить виртуализацию с скалингом.
...
Рейтинг: 0 / 0
масштаб экрана Win 10
    #40092816
_Den_Z_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вспомнил где был пример функции, правда, оно возвращает фактор для обратного скалирования.
Можно посмотреть тут функция GetDisplayScale.
Под нужды dpi ее просто переделать.
Что-то вроде :
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function GetDisplayScale(DevHandle: THandle): TPoint;
var
  DevMode: TDevMode;
begin
  Result.X := GetDeviceCaps(DevHandle, LOGPIXELSX);
  Result.Y := GetDeviceCaps(DevHandle, LOGPIXELSY);
  if (Result.X > 96) and (Result.Y > 96) then Exit;
  ZeroMemory(@DevMode, sizeof(DevMode));
  if EnumDisplaySettings(nil, Cardinal(-1{ENUM_CURRENT_SETTINGS MSDN FLAG}), DevMode) then
  begin
    Result.X := Round(DevMode.dmPelsWidth / GetSystemMetrics(SM_CXSCREEN) * 96);
    Result.Y := Round(DevMode.dmPelsHeight / GetSystemMetrics(SM_CYSCREEN) * 96);
  end;
end;



Независимо от манифеста должно возвращать реальный dpi.
...
Рейтинг: 0 / 0
масштаб экрана Win 10
    #40092836
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и без подключения манифеста:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
unit InitPDIAwareUnit;

interface

uses
  Windows;

implementation

procedure CallSetProcessDPIAware;
var
  SetProcessDPIAware: function: Boolean; stdcall;
  H: THandle;
begin
  H := GetModuleHandle('User32.dll');
  if H > 0 then
  begin
    @SetProcessDPIAware := GetProcAddress(H, 'SetProcessDPIAware');
    if Assigned(SetProcessDPIAware) then
      SetProcessDPIAware();
  end;
end;

initialization
  CallSetProcessDPIAware;

end.
...
Рейтинг: 0 / 0
масштаб экрана Win 10
    #40092963
SilverShield
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Den_Z_, благодарю! Решение подошло!
...
Рейтинг: 0 / 0
масштаб экрана Win 10
    #40132482
kaktus1983
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Существует ли программная возможность запускать приложение с масштабом 100% не зависимо от установленного в Windows?
...
Рейтинг: 0 / 0
масштаб экрана Win 10
    #40132484
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kaktus1983
Существует ли программная возможность запускать приложение с масштабом 100% не зависимо от установленного в Windows?

https://docs.microsoft.com/en-us/windows/win32/hidpi/setting-the-default-dpi-awareness-for-a-process
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / масштаб экрана Win 10
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]