fix(ui): DPI-масштабирование SettingsForm/DeviceForm + общий DpiScale

Вся раскладка окон, построенных кодом (SettingsForm, DeviceForm), была
захардкожена в пикселях под неявные 96 DPI — на Windows 125-200% или
HiDPI-десктопах контролы физически не росли вместе с укрупнившимся
шрифтом. Добавлено масштабирование SetBounds через MulDiv(V,
Screen.PixelsPerInch, 96) на каждой листовой точке потребления
(const-блоки раскладки не трогались).

Общий DpiScale вынесен в новый юнит DpiUtils.pas — убрана дублированная
копия одноимённого приватного метода в 9 классах (FlatCheckBox,
FlatComboBox, FlatListBox, FlatSpinEdit, FlatFloatSpinEdit, FlatEdit,
FlatRadioButton, FlatPopupMenu, SettingsForm, DeviceForm) и инлайн-MulDiv
без обёртки в MainForm.pas/PanafallPanel.pas.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-29 16:05:39 +03:00
co-authored by Claude Sonnet 5
parent 041bc6ba7a
commit c95620fb23
14 changed files with 222 additions and 237 deletions
+37
View File
@@ -0,0 +1,37 @@
unit DpiUtils;
{
DpiUtils.pas — общий пересчёт «дизайн-пикселей» в реальные экранные.
Вся UI-раскладка приложения (кастомные Flat*-контролы и окна, построенные
кодом — SettingsForm, DeviceForm) написана литеральными пикселями под
неявные 96 DPI. DpiScale переводит такое значение в пиксели текущего
монитора: на 96 DPI (обычный десктоп, Windows 100%) возвращает V без
изменений; на более высоком DPI (Windows 125/150/200%, HiDPI-десктопы)
масштабирует пропорционально — тот же приём, что и для стандартных
Windows-контролов (MulDiv), но управляемый вручную, т.к. вся раскладка
строится кодом, а не читается из .lfm (там масштабирование сделал бы LCL
сам через DesignTimePPI).
}
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
interface
uses
Forms, LCLType;
function DpiScale(V: Integer): Integer;
implementation
function DpiScale(V: Integer): Integer;
begin
Result := MulDiv(V, Screen.PixelsPerInch, 96);
if (V > 0) and (Result < 1) then
Result := 1;
end;
end.