diff --git a/DeviceForm.pas b/DeviceForm.pas index fac0013..e6bdcbb 100644 --- a/DeviceForm.pas +++ b/DeviceForm.pas @@ -6,8 +6,8 @@ interface uses Classes, SysUtils, FlatButton, FlatEdit, FlatListBox, AppTheme, Forms, Controls, Graphics, Dialogs, - StdCtrls, ExtCtrls, ComCtrls, - BoardUtils, PlatformUtils, DeviceStore, RadioBackend; + StdCtrls, ExtCtrls, ComCtrls, LCLType, + BoardUtils, PlatformUtils, DeviceStore, RadioBackend, DpiUtils; type // Результат диалога @@ -124,8 +124,8 @@ constructor TDeviceDialog.Create(AOwner: TComponent); begin inherited CreateNew(AOwner); Caption := 'Device Selection'; - Width := DLG_W; - Height := DLG_H; + Width := DpiScale(DLG_W); + Height := DpiScale(DLG_H); Position := poScreenCenter; BorderStyle := bsDialog; Color := CLR_BG; @@ -149,7 +149,11 @@ end; function TDeviceDialog.MakeBtn(AParent: TWinControl; const Cap: string; X, Y, W, H: Integer; AClick: TNotifyEvent): TFlatButton; begin - Result := MakeFlatBtn(AParent, Cap, X, Y, W, H, AClick); + // MakeFlatBtn — общая фабрика в FlatButton.pas, используется и другими + // окнами (PanafallPanel/PopSignalPopup/...) со своей раскладкой; масштаб + // применяем только здесь, на границе вызова из DeviceForm, а не внутри + // самой MakeFlatBtn (иначе задело бы все остальные вызовы). + Result := MakeFlatBtn(AParent, Cap, DpiScale(X), DpiScale(Y), DpiScale(W), DpiScale(H), AClick); end; function TDeviceDialog.MakeLbl(AParent: TWinControl; const Cap: string; @@ -158,7 +162,7 @@ begin Result := TLabel.Create(Self); Result.Parent := AParent; Result.Caption := Cap; - Result.Left := X; Result.Top := Y; + Result.Left := DpiScale(X); Result.Top := DpiScale(Y); Result.Font.Name := 'Courier New'; Result.Font.Size := 8; Result.Font.Color := CLR_TEXTDIM; @@ -174,7 +178,7 @@ begin // --- Левая панель: сохранённые устройства --- PanelLeft := TPanel.Create(Self); PanelLeft.Parent := Self; - PanelLeft.SetBounds(GAP, GAP, LEFT_W, PANEL_H); + PanelLeft.SetBounds(DpiScale(GAP), DpiScale(GAP), DpiScale(LEFT_W), DpiScale(PANEL_H)); PanelLeft.BevelOuter := bvNone; PanelLeft.Color := CLR_PANEL; @@ -182,7 +186,7 @@ begin LstSaved := TFlatListBox.Create(Self); LstSaved.Parent := PanelLeft; - LstSaved.SetBounds(PAD, PAD + LabelH, LEFT_W - PAD * 2, 174); + LstSaved.SetBounds(DpiScale(PAD), DpiScale(PAD + LabelH), DpiScale(LEFT_W - PAD * 2), DpiScale(174)); LstSaved.Color := CLR_BG; LstSaved.Font.Color:= CLR_TEXT; LstSaved.Font.Name := 'Courier New'; @@ -194,7 +198,7 @@ begin MakeLbl(PanelLeft, 'Name:', PAD, FieldTop + 5); EdName := TFlatEdit.Create(Self); EdName.Parent := PanelLeft; - EdName.SetBounds(76, FieldTop, LEFT_W - 76 - PAD, EDIT_H); + EdName.SetBounds(DpiScale(76), DpiScale(FieldTop), DpiScale(LEFT_W - 76 - PAD), DpiScale(EDIT_H)); EdName.Color := CLR_BG; EdName.Font.Color:= CLR_TEXT; EdName.Font.Name := 'Courier New'; @@ -204,7 +208,7 @@ begin MakeLbl(PanelLeft, 'IP:', PAD, FieldTop + 5); EdIP := TFlatEdit.Create(Self); EdIP.Parent := PanelLeft; - EdIP.SetBounds(76, FieldTop, LEFT_W - 76 - PAD, EDIT_H); + EdIP.SetBounds(DpiScale(76), DpiScale(FieldTop), DpiScale(LEFT_W - 76 - PAD), DpiScale(EDIT_H)); EdIP.Color := CLR_BG; EdIP.Font.Color:= CLR_TEXT; EdIP.Font.Name := 'Courier New'; @@ -228,7 +232,7 @@ begin // --- Правая панель: discovery --- PanelRight := TPanel.Create(Self); PanelRight.Parent := Self; - PanelRight.SetBounds(GAP + LEFT_W + GAP, GAP, RIGHT_W, PANEL_H); + PanelRight.SetBounds(DpiScale(GAP + LEFT_W + GAP), DpiScale(GAP), DpiScale(RIGHT_W), DpiScale(PANEL_H)); PanelRight.BevelOuter := bvNone; PanelRight.Color := CLR_PANEL; @@ -236,7 +240,7 @@ begin LstFound := TFlatListBox.Create(Self); LstFound.Parent := PanelRight; - LstFound.SetBounds(PAD, PAD + LabelH, RIGHT_W - PAD * 2, 250); + LstFound.SetBounds(DpiScale(PAD), DpiScale(PAD + LabelH), DpiScale(RIGHT_W - PAD * 2), DpiScale(250)); LstFound.Color := CLR_BG; LstFound.Font.Color:= CLR_TEXT; LstFound.Font.Name := 'Courier New'; diff --git a/DpiUtils.pas b/DpiUtils.pas new file mode 100644 index 0000000..6615fcb --- /dev/null +++ b/DpiUtils.pas @@ -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. diff --git a/FlatCheckBox.pas b/FlatCheckBox.pas index 6315efb..ccf6e53 100644 --- a/FlatCheckBox.pas +++ b/FlatCheckBox.pas @@ -9,7 +9,7 @@ interface uses Classes, SysUtils, Controls, Graphics, Forms, LCLType, LMessages, Types, - AppTheme; + AppTheme, DpiUtils; type TFlatCheckBox = class(TCustomControl) @@ -27,7 +27,6 @@ type FClrCheck: TColor; FClrText: TColor; FClrTextDisabled: TColor; - function DpiScale(V: Integer): Integer; procedure SetChecked(V: Boolean); procedure DoChange; procedure CMTextChanged(var Msg: TLMessage); message CM_TEXTCHANGED; @@ -92,13 +91,6 @@ begin FClrTextDisabled := TColor($00666666); end; -function TFlatCheckBox.DpiScale(V: Integer): Integer; -begin - Result := MulDiv(V, Screen.PixelsPerInch, 96); - if (V > 0) and (Result < 1) then - Result := 1; -end; - procedure TFlatCheckBox.SetAppTheme(const T: TAppTheme); begin FClrBG := T.Panel; diff --git a/FlatComboBox.pas b/FlatComboBox.pas index e6c7aef..688434b 100644 --- a/FlatComboBox.pas +++ b/FlatComboBox.pas @@ -9,7 +9,7 @@ interface uses Classes, SysUtils, Controls, Graphics, Forms, LCLType, LMessages, Types, - Math, AppTheme; + Math, AppTheme, DpiUtils; type TFlatComboBox = class; @@ -52,7 +52,6 @@ type FClrPopupBG: TColor; FClrPopupHot: TColor; FClrPopupSel: TColor; - function DpiScale(V: Integer): Integer; function ItemHeight: Integer; function ArrowWidth: Integer; procedure ItemsChanged(Sender: TObject); @@ -162,7 +161,7 @@ begin Canvas.Brush.Style := bsClear; Canvas.Font.Color := FCombo.FClrText; TextY := Y + (FCombo.ItemHeight - Canvas.TextHeight('Ag')) div 2; - Canvas.TextOut(FCombo.DpiScale(BASE_PAD), TextY, FCombo.Items[ItemIdx]); + Canvas.TextOut(DpiScale(BASE_PAD), TextY, FCombo.Items[ItemIdx]); Canvas.Brush.Style := bsSolid; end; @@ -288,13 +287,6 @@ begin FClrPopupSel := TColor($00183618); end; -function TFlatComboBox.DpiScale(V: Integer): Integer; -begin - Result := MulDiv(V, Screen.PixelsPerInch, 96); - if (V > 0) and (Result < 1) then - Result := 1; -end; - function TFlatComboBox.ItemHeight: Integer; begin Result := DpiScale(BASE_ITEM_H); diff --git a/FlatEdit.pas b/FlatEdit.pas index c8e751a..1996c83 100644 --- a/FlatEdit.pas +++ b/FlatEdit.pas @@ -9,7 +9,7 @@ interface uses Classes, SysUtils, Controls, Graphics, Forms, LCLType, LMessages, Types, - Clipbrd, Math, LazUTF8, AppTheme; + Clipbrd, Math, LazUTF8, AppTheme, DpiUtils; type TFlatEdit = class(TCustomControl) @@ -33,7 +33,6 @@ type FClrTextDim: TColor; FClrSelBG: TColor; FClrSelText: TColor; - function DpiScale(V: Integer): Integer; function DisplayText: string; function TextLen: Integer; function HasSelection: Boolean; @@ -133,13 +132,6 @@ begin inherited Destroy; end; -function TFlatEdit.DpiScale(V: Integer): Integer; -begin - Result := MulDiv(V, Screen.PixelsPerInch, 96); - if (V > 0) and (Result < 1) then - Result := 1; -end; - procedure TFlatEdit.SetAppTheme(const T: TAppTheme); begin FClrOuterBG := T.Panel; diff --git a/FlatFloatSpinEdit.pas b/FlatFloatSpinEdit.pas index d052e78..6d8f3d4 100644 --- a/FlatFloatSpinEdit.pas +++ b/FlatFloatSpinEdit.pas @@ -9,7 +9,7 @@ interface uses Classes, SysUtils, Controls, Graphics, Forms, LCLType, LMessages, Types, - Clipbrd, Math, AppTheme; + Clipbrd, Math, AppTheme, DpiUtils; type TFlatFloatSpinPart = (ffspNone, ffspEdit, ffspUp, ffspDown); @@ -42,7 +42,6 @@ type FClrBtnHot: TColor; FClrBtnDown: TColor; FClrBtnText: TColor; - function DpiScale(V: Integer): Integer; function ButtonWidth: Integer; function EditRect: TRect; function UpRect: TRect; @@ -160,13 +159,6 @@ begin inherited Destroy; end; -function TFlatFloatSpinEdit.DpiScale(V: Integer): Integer; -begin - Result := MulDiv(V, Screen.PixelsPerInch, 96); - if (V > 0) and (Result < 1) then - Result := 1; -end; - function TFlatFloatSpinEdit.ButtonWidth: Integer; begin Result := DpiScale(BASE_BTN_W); diff --git a/FlatListBox.pas b/FlatListBox.pas index a7894a9..4c0af3a 100644 --- a/FlatListBox.pas +++ b/FlatListBox.pas @@ -9,7 +9,7 @@ interface uses Classes, SysUtils, Controls, Graphics, Forms, LCLType, LMessages, Types, - Math, AppTheme; + Math, AppTheme, DpiUtils; type TFlatListBox = class(TCustomControl) @@ -28,7 +28,6 @@ type FClrSelBG: TColor; FClrSelText: TColor; FClrScroll: TColor; - function DpiScale(V: Integer): Integer; function ItemHeight: Integer; function VisibleCount: Integer; function ItemAt(Y: Integer): Integer; @@ -114,13 +113,6 @@ begin inherited Destroy; end; -function TFlatListBox.DpiScale(V: Integer): Integer; -begin - Result := MulDiv(V, Screen.PixelsPerInch, 96); - if (V > 0) and (Result < 1) then - Result := 1; -end; - function TFlatListBox.ItemHeight: Integer; begin Canvas.Font.Assign(Font); diff --git a/FlatPopupMenu.pas b/FlatPopupMenu.pas index 8be16ab..3e621c4 100644 --- a/FlatPopupMenu.pas +++ b/FlatPopupMenu.pas @@ -30,7 +30,7 @@ interface uses Classes, SysUtils, Math, Types, Controls, Graphics, Forms, LCLType, LCLIntf, - AppTheme; + AppTheme, DpiUtils; type TFlatMenuSelect = procedure(Tag: Integer) of object; @@ -45,7 +45,6 @@ type FItemH: Integer; FTheme: TAppTheme; FOnSelect: TFlatMenuSelect; - function DpiScale(V: Integer): Integer; function ItemAt(Y: Integer): Integer; procedure Commit(Idx: Integer); protected @@ -92,12 +91,6 @@ begin FTheme := DarkTheme; end; -function TFlatPopupMenu.DpiScale(V: Integer): Integer; -begin - Result := MulDiv(V, Screen.PixelsPerInch, 96); - if (V > 0) and (Result < 1) then Result := 1; -end; - procedure TFlatPopupMenu.SetTheme(const T: TAppTheme); begin FTheme := T; diff --git a/FlatRadioButton.pas b/FlatRadioButton.pas index 078d438..50e6edc 100644 --- a/FlatRadioButton.pas +++ b/FlatRadioButton.pas @@ -9,7 +9,7 @@ interface uses Classes, SysUtils, Controls, Graphics, Forms, LCLType, LMessages, Types, Math, - AppTheme; + AppTheme, DpiUtils; type TFlatRadioButton = class(TCustomControl) @@ -27,7 +27,6 @@ type FClrDot: TColor; FClrText: TColor; FClrTextDisabled: TColor; - function DpiScale(V: Integer): Integer; procedure SetCheckedSilently(V: Boolean); procedure SetChecked(V: Boolean); procedure DoChange; @@ -93,13 +92,6 @@ begin FClrTextDisabled := TColor($00666666); end; -function TFlatRadioButton.DpiScale(V: Integer): Integer; -begin - Result := MulDiv(V, Screen.PixelsPerInch, 96); - if (V > 0) and (Result < 1) then - Result := 1; -end; - procedure TFlatRadioButton.SetAppTheme(const T: TAppTheme); begin FClrBG := T.Panel; diff --git a/FlatSpinEdit.pas b/FlatSpinEdit.pas index 812d0aa..13ccb3a 100644 --- a/FlatSpinEdit.pas +++ b/FlatSpinEdit.pas @@ -9,7 +9,7 @@ interface uses Classes, SysUtils, Controls, Graphics, Forms, LCLType, LMessages, Types, - Clipbrd, Math, AppTheme; + Clipbrd, Math, AppTheme, DpiUtils; type TFlatSpinPart = (fspNone, fspEdit, fspUp, fspDown); @@ -41,7 +41,6 @@ type FClrBtnHot: TColor; FClrBtnDown: TColor; FClrBtnText: TColor; - function DpiScale(V: Integer): Integer; function ButtonWidth: Integer; function EditRect: TRect; function UpRect: TRect; @@ -153,13 +152,6 @@ begin inherited Destroy; end; -function TFlatSpinEdit.DpiScale(V: Integer): Integer; -begin - Result := MulDiv(V, Screen.PixelsPerInch, 96); - if (V > 0) and (Result < 1) then - Result := 1; -end; - function TFlatSpinEdit.ButtonWidth: Integer; begin Result := DpiScale(BASE_BTN_W); diff --git a/MainForm.pas b/MainForm.pas index 5c317bb..662bf94 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -45,7 +45,7 @@ uses PowerInhibit, DeviceStore, RadioBackend, PlutoBackend, - RadioController, ChannelController; + RadioController, ChannelController, DpiUtils; const // Меню шапки пана: теги ниже — rate в кГц, от DDC_MENU_TAG — выбор hw-DDC. @@ -2746,21 +2746,21 @@ var RULER_H: Integer; PANZOOM_H: Integer; begin - RULER_H := MulDiv(18, Screen.PixelsPerInch, 96); + RULER_H := DpiScale(18); if PanelRight = nil then Exit; if Assigned(FSpecView) then SyncSpecViewFreq; RW := PanelRight.ClientWidth; RH := PanelRight.ClientHeight; // Низ занят панелью пана/зума (позиционирует FPan.Layout той же формулой) — // wideband-блок делит оставшуюся высоту. - PANZOOM_H := MulDiv(22, Screen.PixelsPerInch, 96); + PANZOOM_H := DpiScale(22); if FController.FShowSpectrum or FController.FShowWaterfall then RH := RH - PANZOOM_H; UpdateWidebandFrequencyView; WideH := 0; WideSpecH := 0; if FController.FShowWideband then - WideH := Min(MulDiv(WB_H, Screen.PixelsPerInch, 96), Max(40, RH div 2)); + WideH := Min(DpiScale(WB_H), Max(40, RH div 2)); if WideH > 0 then WideSpecH := Max(1, WideH - RULER_H); // Wideband — всегда во всю ширину PanelRight, самой верхней полосой. @@ -2816,7 +2816,7 @@ end; function TMainForm.Pan0HeaderH: Integer; begin if Pan0HeaderVisible then - Result := MulDiv(20, Screen.PixelsPerInch, 96) // = HEADER_H панели + Result := DpiScale(20) // = HEADER_H панели else Result := 0; end; @@ -7829,7 +7829,7 @@ begin MaxBottom := BtnBand[i].Top + BtnBand[i].Height; BtnH := BtnBand[i].Height; end; - if BtnH = 0 then BtnH := MulDiv(24, Screen.PixelsPerInch, 96); + if BtnH = 0 then BtnH := DpiScale(24); RowH := BtnH + 3; // шаг ряда: высота кнопки + 3px зазор (как 27=24+3 при 1x) Pos := 0; // позиция среди enabled слотов diff --git a/PanafallPanel.pas b/PanafallPanel.pas index ee21ac2..992fab8 100644 --- a/PanafallPanel.pas +++ b/PanafallPanel.pas @@ -35,7 +35,7 @@ uses LCLIntf, LCLType, OpenGLContextEx, AppTheme, WDSPEngine, RadioController, DMRDecoder, VfoOverlay, - SpectrumView, SpectrumViewOpengl, PanZoomBar, FlatButton; + SpectrumView, SpectrumViewOpengl, PanZoomBar, FlatButton, DpiUtils; type TWireFlagEvent = procedure(O: TVfoOverlay) of object; @@ -682,7 +682,7 @@ begin if FBtnAddPan <> nil then FBtnAddPan.Visible := AVisible and WantAdd; if FBtnGrid <> nil then FBtnGrid.Visible := AVisible and WantGrid; if not AVisible then Exit; - Gap := MulDiv(2, Screen.PixelsPerInch, 96); + Gap := DpiScale(2); BtnW := H; // квадратные кнопки в высоту строки NBtns := 3; if WantAdd then Inc(NBtns); @@ -716,9 +716,9 @@ const var RULER_H, PANZOOM_H, HEADER_H: Integer; begin - RULER_H := MulDiv(18, Screen.PixelsPerInch, 96); - PANZOOM_H := MulDiv(22, Screen.PixelsPerInch, 96); - HEADER_H := MulDiv(20, Screen.PixelsPerInch, 96); + RULER_H := DpiScale(18); + PANZOOM_H := DpiScale(22); + HEADER_H := DpiScale(20); Result := ATopOffset; if FHeaderVisible then Inc(Result, HEADER_H); if (AShowSpectrum or AShowWaterfall) and FShowZoomRow then @@ -751,7 +751,7 @@ begin FShowSpectrum := AShowSpectrum; FShowWaterfall := AShowWaterfall; FSplitAvailH := 0; // валидно только в режиме «спектр+водопад» (ниже) - RULER_H := MulDiv(18, Screen.PixelsPerInch, 96); + RULER_H := DpiScale(18); // Регион пана — прямоугольник [X0..X0+RW) × [FStackTop..RH): грид-раскладка // ставит паны колонками; 0/0 по каждой оси = весь родитель. X0 := FStackLeft; @@ -767,7 +767,7 @@ begin else RH := FParent.ClientHeight; // Шапка пана — первой строкой региона (видна при панах >= 2). - HEADER_H := MulDiv(20, Screen.PixelsPerInch, 96); + HEADER_H := DpiScale(20); if FHeaderPanel <> nil then begin FHeaderPanel.Visible := FHeaderVisible; @@ -778,7 +778,7 @@ begin end; end; // Резервируем низ под панель пана/зума (видна, если виден спектр или водопад). - PANZOOM_H := MulDiv(22, Screen.PixelsPerInch, 96); + PANZOOM_H := DpiScale(22); ShowPZ := (AShowSpectrum or AShowWaterfall) and FShowZoomRow; PositionPanZoomBar(X0, RH - PANZOOM_H, RW, PANZOOM_H, ShowPZ); if ShowPZ then RH := RH - PANZOOM_H; @@ -943,7 +943,7 @@ const MIN_SH = 60; MIN_WH = 40; begin - RULER_H := MulDiv(18, Screen.PixelsPerInch, 96); + RULER_H := DpiScale(18); if not FSplitterDrag then Exit; // Геометрия региона ЭТОГО пана из последнего Layout (стек панов!), // а не от всего родителя. diff --git a/SettingsForm.pas b/SettingsForm.pas index d539012..44ff617 100644 --- a/SettingsForm.pas +++ b/SettingsForm.pas @@ -26,10 +26,10 @@ interface uses Classes, SysUtils, Math, Forms, Controls, Graphics, Dialogs, - StdCtrls, ExtCtrls, + StdCtrls, ExtCtrls, LCLType, FlatButton, FlatCheckBox, FlatComboBox, FlatEdit, FlatSpinEdit, FlatFloatSpinEdit, FlatRadioButton, - EqualizerControl, AudioOutput, AudioInput, AppTheme, Settings, BoardUtils; + EqualizerControl, AudioOutput, AudioInput, AppTheme, Settings, BoardUtils, DpiUtils; type // PA: MaxPower в Вт, BandCal[0..10] — калибровка 38.8..100.0 на диапазон @@ -697,8 +697,8 @@ constructor TSettingsForm.Create(AOwner: TComponent); begin inherited CreateNew(AOwner); Caption := 'Settings'; - Width := 1180; - Height := 720; + Width := DpiScale(1180); + Height := DpiScale(720); Position := poScreenCenter; BorderStyle := bsSizeable; Color := CLR_BG; @@ -721,9 +721,9 @@ begin Result := TLabel.Create(Self); Result.Parent := AParent; Result.Caption := Cap; - Result.Left := ALeft; - Result.Top := ATop; - if AW > 0 then Result.Width := AW; + Result.Left := DpiScale(ALeft); + Result.Top := DpiScale(ATop); + if AW > 0 then Result.Width := DpiScale(AW); Result.Font.Color := CLR_TEXTDIM; Result.Font.Name := UI_FONT; Result.Font.Size := 9; @@ -734,10 +734,10 @@ function TSettingsForm.MakeCombo(AParent: TWinControl; ALeft, ATop, AW: Integer; begin Result := TFlatComboBox.Create(Self); Result.Parent := AParent; - Result.Left := ALeft; - Result.Top := ATop; - Result.Width := AW; - Result.Height := BTN_H; + Result.Left := DpiScale(ALeft); + Result.Top := DpiScale(ATop); + Result.Width := DpiScale(AW); + Result.Height := DpiScale(BTN_H); Result.Color := CLR_INPUT; Result.Font.Color := CLR_INPUT_TEXT; Result.Font.Name := UI_FONT; @@ -752,17 +752,19 @@ function TSettingsForm.MakeGroupPanel(AParent: TWinControl; const Cap: string; var TitleLbl: TLabel; Divider: TPanel; + SAW: Integer; // AW уже пересчитан в реальные пиксели — используем везде ниже begin + SAW := DpiScale(AW); Result := TPanel.Create(Self); Result.Parent := AParent; - Result.SetBounds(ALeft, ATop, AW, AH); + Result.SetBounds(DpiScale(ALeft), DpiScale(ATop), SAW, DpiScale(AH)); Result.BevelOuter := bvNone; Result.Color := CLR_PANEL; TitleLbl := TLabel.Create(Self); TitleLbl.Parent := Result; TitleLbl.Caption := Cap; - TitleLbl.SetBounds(8, 5, AW - 16, 14); + TitleLbl.SetBounds(DpiScale(8), DpiScale(5), SAW - DpiScale(16), DpiScale(14)); TitleLbl.Font.Color := CLR_ACCENT; TitleLbl.Font.Name := UI_FONT; TitleLbl.Font.Size := 9; @@ -770,7 +772,7 @@ begin Divider := TPanel.Create(Self); Divider.Parent := Result; - Divider.SetBounds(0, GRP_TITLE_H, AW + 200, 1); + Divider.SetBounds(0, DpiScale(GRP_TITLE_H), SAW + DpiScale(200), 1); Divider.BevelOuter := bvNone; Divider.Color := CLR_BORDER; end; @@ -791,7 +793,7 @@ begin Result := TFlatButton.Create(Self); Result.Parent := FNavPanel; Result.Caption := Cap; - Result.SetBounds(10, ATop, 166, 32); + Result.SetBounds(DpiScale(10), DpiScale(ATop), DpiScale(166), DpiScale(32)); Result.Anchors := [akLeft, akTop, akRight]; Result.OnClick := NavClick; Result.ClrNorm := CLR_PANEL; @@ -814,7 +816,7 @@ begin FNavPanel := TPanel.Create(Self); FNavPanel.Parent := Self; FNavPanel.Align := alLeft; - FNavPanel.Width := 188; + FNavPanel.Width := DpiScale(188); FNavPanel.BevelOuter := bvNone; FNavPanel.Color := TColor($00151515); @@ -822,7 +824,7 @@ begin begin Parent := FNavPanel; Caption := 'Settings'; - SetBounds(14, 14, 160, 24); + SetBounds(DpiScale(14), DpiScale(14), DpiScale(160), DpiScale(24)); Font.Name := UI_FONT; Font.Size := 14; Font.Style := [fsBold]; @@ -833,7 +835,7 @@ begin begin Parent := FNavPanel; Caption := 'EWSDR'; - SetBounds(14, 39, 160, 18); + SetBounds(DpiScale(14), DpiScale(39), DpiScale(160), DpiScale(18)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; @@ -897,7 +899,7 @@ begin FBtnClose := TFlatButton.Create(Self); FBtnClose.Parent := Self; FBtnClose.Caption := 'Close'; - FBtnClose.SetBounds(Width - 106, Height - 40, 92, 28); + FBtnClose.SetBounds(Width - DpiScale(106), Height - DpiScale(40), DpiScale(92), DpiScale(28)); FBtnClose.Anchors := [akRight, akBottom]; FBtnClose.OnClick := BtnCloseClick; FBtnClose.ClrNorm := CLR_PANEL; @@ -984,7 +986,7 @@ begin begin Parent := FPageAudio; Caption := 'Audio'; - SetBounds(MARGIN, 18, 400, 28); + SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(400), DpiScale(28)); Font.Name := UI_FONT; Font.Size := 16; Font.Style := [fsBold]; @@ -995,7 +997,7 @@ begin begin Parent := FPageAudio; Caption := 'Input and output devices used by the receiver and transmitter.'; - SetBounds(MARGIN, 48, 560, 20); + SetBounds(DpiScale(MARGIN), DpiScale(48), DpiScale(560), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; @@ -1023,7 +1025,7 @@ begin FChkSendAudioToRadio := TFlatCheckBox.Create(Self); FChkSendAudioToRadio.Parent := Grp; FChkSendAudioToRadio.Caption := 'Send audio stream to radio (built-in speaker)'; - FChkSendAudioToRadio.SetBounds(PAD, R1, 420, 22); + FChkSendAudioToRadio.SetBounds(DpiScale(PAD), DpiScale(R1), DpiScale(420), DpiScale(22)); FChkSendAudioToRadio.Checked := False; FChkSendAudioToRadio.Font.Color := CLR_TEXT; FChkSendAudioToRadio.Font.Name := UI_FONT; @@ -1052,7 +1054,7 @@ begin begin Parent := FPageDisplay; Caption := 'Display'; - SetBounds(MARGIN, 18, 400, 28); + SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(400), DpiScale(28)); Font.Name := UI_FONT; Font.Size := 16; Font.Style := [fsBold]; @@ -1063,7 +1065,7 @@ begin begin Parent := FPageDisplay; Caption := 'General visual options. Spectrum and waterfall processing are split into their own pages.'; - SetBounds(MARGIN, 48, 680, 20); + SetBounds(DpiScale(MARGIN), DpiScale(48), DpiScale(680), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; @@ -1074,7 +1076,7 @@ begin FChkShowSpectrum := TFlatCheckBox.Create(Self); FChkShowSpectrum.Parent := Grp; FChkShowSpectrum.Caption := 'Spectrum'; - FChkShowSpectrum.SetBounds(PAD, R1, CHKW, 22); + FChkShowSpectrum.SetBounds(DpiScale(PAD), DpiScale(R1), DpiScale(CHKW), DpiScale(22)); FChkShowSpectrum.Checked := True; FChkShowSpectrum.Font.Color := CLR_TEXT; FChkShowSpectrum.Font.Name := UI_FONT; @@ -1084,7 +1086,7 @@ begin FChkShowWaterfall := TFlatCheckBox.Create(Self); FChkShowWaterfall.Parent := Grp; FChkShowWaterfall.Caption := 'Waterfall'; - FChkShowWaterfall.SetBounds(PAD + CHKW + 20, R1, CHKW, 22); + FChkShowWaterfall.SetBounds(DpiScale(PAD + CHKW + 20), DpiScale(R1), DpiScale(CHKW), DpiScale(22)); FChkShowWaterfall.Checked := True; FChkShowWaterfall.Font.Color := CLR_TEXT; FChkShowWaterfall.Font.Name := UI_FONT; @@ -1094,7 +1096,7 @@ begin FChkShowWideband := TFlatCheckBox.Create(Self); FChkShowWideband.Parent := Grp; FChkShowWideband.Caption := 'Wideband'; - FChkShowWideband.SetBounds(PAD + (CHKW + 20) * 2, R1, CHKW, 22); + FChkShowWideband.SetBounds(DpiScale(PAD + (CHKW + 20) * 2), DpiScale(R1), DpiScale(CHKW), DpiScale(22)); FChkShowWideband.Checked := False; FChkShowWideband.Font.Color := CLR_TEXT; FChkShowWideband.Font.Name := UI_FONT; @@ -1104,7 +1106,7 @@ begin FChkWidebandFill := TFlatCheckBox.Create(Self); FChkWidebandFill.Parent := Grp; FChkWidebandFill.Caption := 'Wideband gradient fill'; - FChkWidebandFill.SetBounds(PAD + (CHKW + 20) * 2, R1 + 28, CHKW, 22); + FChkWidebandFill.SetBounds(DpiScale(PAD + (CHKW + 20) * 2), DpiScale(R1 + 28), DpiScale(CHKW), DpiScale(22)); FChkWidebandFill.Checked := False; FChkWidebandFill.Font.Color := CLR_TEXT; FChkWidebandFill.Font.Name := UI_FONT; @@ -1114,7 +1116,7 @@ begin FChkSpectrumFill := TFlatCheckBox.Create(Self); FChkSpectrumFill.Parent := Grp; FChkSpectrumFill.Caption := 'Spectrum gradient fill'; - FChkSpectrumFill.SetBounds(PAD, R1 + 28, CHKW, 22); + FChkSpectrumFill.SetBounds(DpiScale(PAD), DpiScale(R1 + 28), DpiScale(CHKW), DpiScale(22)); FChkSpectrumFill.Checked := True; FChkSpectrumFill.Font.Color := CLR_TEXT; FChkSpectrumFill.Font.Name := UI_FONT; @@ -1134,7 +1136,7 @@ begin FChkLightTheme := TFlatCheckBox.Create(Self); FChkLightTheme.Parent := Grp; FChkLightTheme.Caption := 'Light theme'; - FChkLightTheme.SetBounds(PAD, R1, CHKW, 22); + FChkLightTheme.SetBounds(DpiScale(PAD), DpiScale(R1), DpiScale(CHKW), DpiScale(22)); FChkLightTheme.Checked := False; FChkLightTheme.Font.Color := CLR_TEXT; FChkLightTheme.Font.Name := UI_FONT; @@ -1177,7 +1179,7 @@ var begin Result := TFlatFloatSpinEdit.Create(Self); Result.Parent := Grp; - Result.SetBounds(AX, AY, AW, BTN_H); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(AW), DpiScale(BTN_H)); Result.Value := AValue; Result.MinValue := AMin; Result.MaxValue := AMax; Result.Increment := AInc; Result.DecimalPlaces := 1; @@ -1191,7 +1193,7 @@ var begin Result := TFlatEdit.Create(Self); Result.Parent := Grp; - Result.SetBounds(AX, AY, AW, BTN_H); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(AW), DpiScale(BTN_H)); Result.Color := CLR_INPUT; Result.Font.Color := CLR_INPUT_TEXT; Result.Font.Name := UI_FONT; Result.Font.Size := 9; Result.Text := AText; Result.OnExit := AOnExit; @@ -1202,7 +1204,7 @@ begin begin Parent := FPageSpectrum; Caption := 'Spectrum'; - SetBounds(MARGIN, 18, 400, 28); + SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(400), DpiScale(28)); Font.Name := UI_FONT; Font.Size := 16; Font.Style := [fsBold]; @@ -1213,7 +1215,7 @@ begin begin Parent := FPageSpectrum; Caption := 'Analyzer, detector, averaging and grid parameters for RX1.'; - SetBounds(MARGIN, 48, 620, 20); + SetBounds(DpiScale(MARGIN), DpiScale(48), DpiScale(620), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; @@ -1258,7 +1260,7 @@ begin begin Parent := FPageWaterfall; Caption := 'Waterfall'; - SetBounds(MARGIN, 18, 400, 28); + SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(400), DpiScale(28)); Font.Name := UI_FONT; Font.Size := 16; Font.Style := [fsBold]; @@ -1269,7 +1271,7 @@ begin begin Parent := FPageWaterfall; Caption := 'Waterfall detector, smoothing and color scale thresholds.'; - SetBounds(MARGIN, 48, 620, 20); + SetBounds(DpiScale(MARGIN), DpiScale(48), DpiScale(620), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; @@ -1297,7 +1299,7 @@ begin FChkWfAGC := TFlatCheckBox.Create(Self); FChkWfAGC.Parent := Grp; FChkWfAGC.Caption := 'Waterfall AGC'; - FChkWfAGC.SetBounds(PAD, R1, 200, 22); + FChkWfAGC.SetBounds(DpiScale(PAD), DpiScale(R1), DpiScale(200), DpiScale(22)); FChkWfAGC.Checked := True; FChkWfAGC.Font.Color := CLR_TEXT; FChkWfAGC.Font.Name := UI_FONT; @@ -1306,7 +1308,7 @@ begin FChkWfNF := TFlatCheckBox.Create(Self); FChkWfNF.Parent := Grp; FChkWfNF.Caption := 'Waterfall NF'; - FChkWfNF.SetBounds(PAD, R1 + STEP, 200, 22); + FChkWfNF.SetBounds(DpiScale(PAD), DpiScale(R1 + STEP), DpiScale(200), DpiScale(22)); FChkWfNF.Checked := False; FChkWfNF.Font.Color := CLR_TEXT; FChkWfNF.Font.Name := UI_FONT; @@ -1354,7 +1356,7 @@ var begin Result := TFlatSpinEdit.Create(Self); Result.Parent := AParent; - Result.SetBounds(AX, AY, SPW, BTN_H); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(SPW), DpiScale(BTN_H)); Result.MinValue := AMin; Result.MaxValue := AMax; Result.Value := AVal; @@ -1370,7 +1372,7 @@ var begin Result := TFlatFloatSpinEdit.Create(Self); Result.Parent := AParent; - Result.SetBounds(AX, AY, SPW, BTN_H); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(SPW), DpiScale(BTN_H)); Result.MinValue := AMin; Result.MaxValue := AMax; Result.Increment := AInc; @@ -1388,7 +1390,7 @@ var Result := TFlatCheckBox.Create(Self); Result.Parent := AParent; Result.Caption := ACap; - Result.SetBounds(AX, AY, AW, 22); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(AW), DpiScale(22)); Result.Font.Color := CLR_TEXT; Result.Font.Name := UI_FONT; Result.Font.Size := 9; @@ -1405,7 +1407,7 @@ begin begin Parent := FPageTransmit; Caption := 'Transmit'; - SetBounds(MARGIN, 18, 400, 28); + SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(400), DpiScale(28)); Font.Name := UI_FONT; Font.Size := 16; Font.Style := [fsBold]; @@ -1415,7 +1417,7 @@ begin begin Parent := FPageTransmit; Caption := 'TX-цепь WDSP: микрофон, фильтр, динамическая обработка, модуляция.'; - SetBounds(MARGIN, 48, 700, 20); + SetBounds(DpiScale(MARGIN), DpiScale(48), DpiScale(700), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; @@ -1522,7 +1524,7 @@ begin FTXEQControl := TEqualizerControl.Create(Self); FTXEQControl.Parent := Grp; - FTXEQControl.SetBounds(PAD, R1, GRP_W - 2 * PAD, 326); + FTXEQControl.SetBounds(DpiScale(PAD), DpiScale(R1), DpiScale(GRP_W - 2 * PAD), DpiScale(326)); FTXEQControl.Font.Name := UI_FONT; FTXEQControl.Font.Size := 9; FTXEQControl.SetThemeColors(CLR_PANEL, TColor($00202020), CLR_BORDER, @@ -1598,7 +1600,7 @@ begin MakeLbl(Grp, 'Reference level', PAD, R1 + 5, LW); FEdTXRefLevel := TFlatEdit.Create(Self); FEdTXRefLevel.Parent := Grp; - FEdTXRefLevel.SetBounds(CX, R1, 96, BTN_H); + FEdTXRefLevel.SetBounds(DpiScale(CX), DpiScale(R1), DpiScale(96), DpiScale(BTN_H)); FEdTXRefLevel.Color := CLR_INPUT; FEdTXRefLevel.Font.Color := CLR_INPUT_TEXT; FEdTXRefLevel.Font.Name := UI_FONT; @@ -1609,7 +1611,7 @@ begin MakeLbl(Grp, 'Range (dB)', PAD, R1 + STEP + 5, LW); FEdTXRange := TFlatEdit.Create(Self); FEdTXRange.Parent := Grp; - FEdTXRange.SetBounds(CX, R1 + STEP, 96, BTN_H); + FEdTXRange.SetBounds(DpiScale(CX), DpiScale(R1 + STEP), DpiScale(96), DpiScale(BTN_H)); FEdTXRange.Color := CLR_INPUT; FEdTXRange.Font.Color := CLR_INPUT_TEXT; FEdTXRange.Font.Name := UI_FONT; @@ -1866,7 +1868,7 @@ const begin E := TFlatFloatSpinEdit.Create(Self); E.Parent := AParent; - E.SetBounds(ALeft, ATop, ED_W, BTN_H + 2); + E.SetBounds(DpiScale(ALeft), DpiScale(ATop), DpiScale(ED_W), DpiScale(BTN_H + 2)); E.Color := CLR_INPUT; E.Font.Color := CLR_INPUT_TEXT; E.Font.Name := UI_FONT; @@ -1890,7 +1892,7 @@ begin begin Parent := FPagePA; Caption := 'Power Amplifier'; - SetBounds(MARGIN, 18, 400, 28); + SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(400), DpiScale(28)); Font.Name := UI_FONT; Font.Size := 16; Font.Style := [fsBold]; @@ -1901,7 +1903,7 @@ begin begin Parent := FPagePA; Caption := 'Output limit and per-band calibration values.'; - SetBounds(MARGIN, 48, 620, 20); + SetBounds(DpiScale(MARGIN), DpiScale(48), DpiScale(620), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; @@ -1913,14 +1915,14 @@ begin Lbl := TLabel.Create(Self); Lbl.Parent := Grp; Lbl.Caption := 'Max power (W)'; - Lbl.SetBounds(GRP_PAD, R1 + 6, 132, 18); + Lbl.SetBounds(DpiScale(GRP_PAD), DpiScale(R1 + 6), DpiScale(132), DpiScale(18)); Lbl.Font.Color := CLR_TEXTDIM; Lbl.Font.Name := UI_FONT; Lbl.Font.Size := 9; Spin := TFlatSpinEdit.Create(Self); Spin.Parent := Grp; - Spin.SetBounds(GRP_PAD + 150, R1, ED_W, BTN_H + 2); + Spin.SetBounds(DpiScale(GRP_PAD + 150), DpiScale(R1), DpiScale(ED_W), DpiScale(BTN_H + 2)); Spin.Color := CLR_INPUT; Spin.Font.Color := CLR_INPUT_TEXT; Spin.Font.Name := UI_FONT; @@ -1936,14 +1938,14 @@ begin Lbl := TLabel.Create(Self); Lbl.Parent := Grp; Lbl.Caption := 'Pluto TX att @100% (dB)'; - Lbl.SetBounds(GRP_PAD + 320, R1 + 6, 180, 18); + Lbl.SetBounds(DpiScale(GRP_PAD + 320), DpiScale(R1 + 6), DpiScale(180), DpiScale(18)); Lbl.Font.Color := CLR_TEXTDIM; Lbl.Font.Name := UI_FONT; Lbl.Font.Size := 9; FEdPlutoTxMaxAtt := TFlatFloatSpinEdit.Create(Self); FEdPlutoTxMaxAtt.Parent := Grp; - FEdPlutoTxMaxAtt.SetBounds(GRP_PAD + 510, R1, ED_W, BTN_H + 2); + FEdPlutoTxMaxAtt.SetBounds(DpiScale(GRP_PAD + 510), DpiScale(R1), DpiScale(ED_W), DpiScale(BTN_H + 2)); FEdPlutoTxMaxAtt.Color := CLR_INPUT; FEdPlutoTxMaxAtt.Font.Color := CLR_INPUT_TEXT; FEdPlutoTxMaxAtt.Font.Name := UI_FONT; @@ -1959,7 +1961,7 @@ begin Lbl := TLabel.Create(Self); Lbl.Parent := Grp; Lbl.Caption := 'Calibration per band, 38.8 ... 100.0'; - Lbl.SetBounds(GRP_PAD, R1 + ROW_H + 12, 320, 18); + Lbl.SetBounds(DpiScale(GRP_PAD), DpiScale(R1 + ROW_H + 12), DpiScale(320), DpiScale(18)); Lbl.Font.Color := CLR_TEXTDIM; Lbl.Font.Name := UI_FONT; Lbl.Font.Size := 9; @@ -1975,7 +1977,7 @@ begin Lbl := TLabel.Create(Self); Lbl.Parent := Grp; Lbl.Caption := PA_BAND_NAMES[i] + ':'; - Lbl.SetBounds(X, Y + 5, LBL_W, 18); + Lbl.SetBounds(DpiScale(X), DpiScale(Y + 5), DpiScale(LBL_W), DpiScale(18)); Lbl.Font.Color := CLR_TEXTDIM; Lbl.Font.Name := UI_FONT; Lbl.Font.Size := 9; @@ -1991,7 +1993,7 @@ begin Lbl := TLabel.Create(Self); Lbl.Parent := Grp; Lbl.Caption := 'Calibration per transverter slot, 38.8 ... 100.0'; - Lbl.SetBounds(GRP_PAD, R1, 420, 18); + Lbl.SetBounds(DpiScale(GRP_PAD), DpiScale(R1), DpiScale(420), DpiScale(18)); Lbl.Font.Color := CLR_TEXTDIM; Lbl.Font.Name := UI_FONT; Lbl.Font.Size := 9; @@ -2007,7 +2009,7 @@ begin Lbl.Parent := Grp; Lbl.Caption := 'VHF' + IntToStr(i) + ':'; Lbl.AutoSize := False; - Lbl.SetBounds(X, Y + 5, VHF_LBL_W, 18); + Lbl.SetBounds(DpiScale(X), DpiScale(Y + 5), DpiScale(VHF_LBL_W), DpiScale(18)); Lbl.Font.Color := CLR_TEXTDIM; Lbl.Font.Name := UI_FONT; Lbl.Font.Size := 9; @@ -2036,8 +2038,8 @@ const if L = nil then Exit; L.AutoSize := False; L.WordWrap := True; - L.Width := AW; - L.Height := AH; + L.Width := DpiScale(AW); + L.Height := DpiScale(AH); end; function MakeCalSpin(AParent: TWinControl; ALeft, ATop: Integer; @@ -2047,7 +2049,7 @@ const begin E := TFlatFloatSpinEdit.Create(Self); E.Parent := AParent; - E.SetBounds(ALeft, ATop, CAL_ED_W, BTN_H + 2); + E.SetBounds(DpiScale(ALeft), DpiScale(ATop), DpiScale(CAL_ED_W), DpiScale(BTN_H + 2)); E.Color := CLR_INPUT; E.Font.Color := CLR_INPUT_TEXT; E.Font.Name := UI_FONT; @@ -2081,7 +2083,7 @@ begin begin Parent := FPageCalib; Caption := 'Calibration'; - SetBounds(CAL_MARGIN, 18, 400, 28); + SetBounds(DpiScale(CAL_MARGIN), DpiScale(18), DpiScale(400), DpiScale(28)); Font.Name := UI_FONT; Font.Size := 16; Font.Style := [fsBold]; @@ -2092,7 +2094,7 @@ begin begin Parent := FPageCalib; Caption := 'Power/SWR detector, supply voltage/current and S-meter calibration.'; - SetBounds(CAL_MARGIN, 48, 620, 20); + SetBounds(DpiScale(CAL_MARGIN), DpiScale(48), DpiScale(620), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; @@ -2197,7 +2199,7 @@ begin FBtnDispFromSM := TFlatButton.Create(Self); FBtnDispFromSM.Parent := Grp; FBtnDispFromSM.Caption := '= S-meter'; - FBtnDispFromSM.SetBounds(CAL_GRP_W - 130, 24, 112, BTN_H); + FBtnDispFromSM.SetBounds(DpiScale(CAL_GRP_W - 130), DpiScale(24), DpiScale(112), DpiScale(BTN_H)); FBtnDispFromSM.OnClick := OnCalDispFromSMClick; FBtnDispFromSM.ClrNorm := CLR_PANEL; FBtnDispFromSM.ClrBorder := TColor($00404040); @@ -2287,12 +2289,12 @@ begin if FLblPADetCal[i] <> nil then begin FLblPADetCal[i].Caption := Nm + ':'; - FLblPADetCal[i].SetBounds(X, Y + 5, CAL_LBL_W, 18); + FLblPADetCal[i].SetBounds(DpiScale(X), DpiScale(Y + 5), DpiScale(CAL_LBL_W), DpiScale(18)); FLblPADetCal[i].Visible := Nm <> ''; end; if FEdPADetCal[i] <> nil then begin - FEdPADetCal[i].SetBounds(X + CAL_LBL_W, Y, CAL_ED_W, BTN_H + 2); + FEdPADetCal[i].SetBounds(DpiScale(X + CAL_LBL_W), DpiScale(Y), DpiScale(CAL_ED_W), DpiScale(BTN_H + 2)); FEdPADetCal[i].Visible := Nm <> ''; end; end; @@ -2309,16 +2311,16 @@ begin FCalGrpVA.Visible := not FCalIsPluto; if not FCalIsPluto then begin - FCalGrpDet.SetBounds(CAL_MARGIN, GTop, CAL_GRP_W, CAL_GRP1_H); + FCalGrpDet.SetBounds(DpiScale(CAL_MARGIN), DpiScale(GTop), DpiScale(CAL_GRP_W), DpiScale(CAL_GRP1_H)); GTop := GTop + CAL_GRP1_H + 14; - FCalGrpVA.SetBounds(CAL_MARGIN, GTop, CAL_GRP_W, CAL_GRP2_H); + FCalGrpVA.SetBounds(DpiScale(CAL_MARGIN), DpiScale(GTop), DpiScale(CAL_GRP_W), DpiScale(CAL_GRP2_H)); GTop := GTop + CAL_GRP2_H + 14; end; - FCalGrpSM.SetBounds(CAL_MARGIN, GTop, CAL_GRP_W, HSM); + FCalGrpSM.SetBounds(DpiScale(CAL_MARGIN), DpiScale(GTop), DpiScale(CAL_GRP_W), DpiScale(HSM)); GTop := GTop + HSM + 14; - FCalGrpDisp.SetBounds(CAL_MARGIN, GTop, CAL_GRP_W, HDisp); + FCalGrpDisp.SetBounds(DpiScale(CAL_MARGIN), DpiScale(GTop), DpiScale(CAL_GRP_W), DpiScale(HDisp)); GTop := GTop + HDisp + 14; - FCalGrpFreq.SetBounds(CAL_MARGIN, GTop, CAL_GRP_W, CAL_GRP2_H); + FCalGrpFreq.SetBounds(DpiScale(CAL_MARGIN), DpiScale(GTop), DpiScale(CAL_GRP_W), DpiScale(CAL_GRP2_H)); end; function TSettingsForm.LayoutCalOffsets(const BandLbl: array of TLabel; @@ -2342,19 +2344,19 @@ begin if BandLbl[i] <> nil then begin BandLbl[i].Caption := Nm + ':'; - BandLbl[i].SetBounds(X, Y + 5, CAL_SM_LBL_W, 18); + BandLbl[i].SetBounds(DpiScale(X), DpiScale(Y + 5), DpiScale(CAL_SM_LBL_W), DpiScale(18)); BandLbl[i].Visible := Nm <> ''; end; if BandEd[i] <> nil then begin - BandEd[i].SetBounds(X + CAL_SM_LBL_W, Y, CAL_ED_W, BTN_H + 2); + BandEd[i].SetBounds(DpiScale(X + CAL_SM_LBL_W), DpiScale(Y), DpiScale(CAL_ED_W), DpiScale(BTN_H + 2)); BandEd[i].Visible := Nm <> ''; end; if Nm <> '' then BandRows := r + 1; end; Y := Y0 + BandRows * CAL_ROW_H + 6; - XvtrHdr.SetBounds(CAL_PAD, Y, 300, 18); + XvtrHdr.SetBounds(DpiScale(CAL_PAD), DpiScale(Y), DpiScale(300), DpiScale(18)); Slot := 0; for i := 0 to CFG_XVTR_COUNT - 1 do begin @@ -2367,9 +2369,8 @@ begin else Nm := 'XVTR' + IntToStr(i); XvtrLbl[i].Caption := Nm + ':'; XvtrLbl[i].Hint := 'XVTR' + IntToStr(i) + ' (' + Nm + ')'; - XvtrLbl[i].SetBounds(X, Y + 24 + r * CAL_ROW_H + 5, CAL_SM_LBL_W, 18); - XvtrEd[i].SetBounds(X + CAL_SM_LBL_W, Y + 24 + r * CAL_ROW_H, - CAL_ED_W, BTN_H + 2); + XvtrLbl[i].SetBounds(DpiScale(X), DpiScale(Y + 24 + r * CAL_ROW_H + 5), DpiScale(CAL_SM_LBL_W), DpiScale(18)); + XvtrEd[i].SetBounds(DpiScale(X + CAL_SM_LBL_W), DpiScale(Y + 24 + r * CAL_ROW_H), DpiScale(CAL_ED_W), DpiScale(BTN_H + 2)); Inc(Slot); end; XvtrLbl[i].Visible := FCalXvtrOn[i]; @@ -2502,7 +2503,7 @@ begin begin Parent := FPageAdvanced; Caption := 'Advanced'; - SetBounds(MARGIN, 18, 400, 28); + SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(400), DpiScale(28)); Font.Name := UI_FONT; Font.Size := 16; Font.Style := [fsBold]; @@ -2515,7 +2516,7 @@ begin Chk := TFlatCheckBox.Create(Self); Chk.Parent := Grp; Chk.Caption := 'Dither Enabled'; - Chk.SetBounds(GRP_PAD, R1, 260, 22); + Chk.SetBounds(DpiScale(GRP_PAD), DpiScale(R1), DpiScale(260), DpiScale(22)); Chk.Font.Name := UI_FONT; Chk.Font.Size := 9; Chk.Font.Color := CLR_TEXT; @@ -2526,7 +2527,7 @@ begin Chk := TFlatCheckBox.Create(Self); Chk.Parent := Grp; Chk.Caption := 'Random Enabled'; - Chk.SetBounds(GRP_PAD, R1 + ROW_H, 260, 22); + Chk.SetBounds(DpiScale(GRP_PAD), DpiScale(R1 + ROW_H), DpiScale(260), DpiScale(22)); Chk.Font.Name := UI_FONT; Chk.Font.Size := 9; Chk.Font.Color := CLR_TEXT; @@ -2541,7 +2542,7 @@ begin Chk := TFlatCheckBox.Create(Self); Chk.Parent := Grp; Chk.Caption := 'Enabled'; - Chk.SetBounds(GRP_PAD, Y, 260, 22); + Chk.SetBounds(DpiScale(GRP_PAD), DpiScale(Y), DpiScale(260), DpiScale(22)); Chk.Font.Name := UI_FONT; Chk.Font.Size := 9; Chk.Font.Color := CLR_TEXT; @@ -2553,7 +2554,7 @@ begin MakeLbl(Grp, 'Port:', GRP_PAD, Y + 4, LBL_W); Spin := TFlatSpinEdit.Create(Self); Spin.Parent := Grp; - Spin.SetBounds(GRP_PAD + LBL_W + 12, Y, 90, BTN_H); + Spin.SetBounds(DpiScale(GRP_PAD + LBL_W + 12), DpiScale(Y), DpiScale(90), DpiScale(BTN_H)); Spin.Color := CLR_INPUT; Spin.Font.Color := CLR_INPUT_TEXT; Spin.Font.Name := UI_FONT; @@ -2568,7 +2569,7 @@ begin MakeLbl(Grp, 'Interface:', GRP_PAD, Y + 4, LBL_W); Ed := TFlatEdit.Create(Self); Ed.Parent := Grp; - Ed.SetBounds(GRP_PAD + LBL_W + 12, Y, ED_W, BTN_H); + Ed.SetBounds(DpiScale(GRP_PAD + LBL_W + 12), DpiScale(Y), DpiScale(ED_W), DpiScale(BTN_H)); Ed.Color := CLR_INPUT; Ed.Font.Color := CLR_INPUT_TEXT; Ed.Font.Name := UI_FONT; @@ -2581,7 +2582,7 @@ begin MakeLbl(Grp, 'Username:', GRP_PAD, Y + 4, LBL_W); Ed := TFlatEdit.Create(Self); Ed.Parent := Grp; - Ed.SetBounds(GRP_PAD + LBL_W + 12, Y, ED_W, BTN_H); + Ed.SetBounds(DpiScale(GRP_PAD + LBL_W + 12), DpiScale(Y), DpiScale(ED_W), DpiScale(BTN_H)); Ed.Color := CLR_INPUT; Ed.Font.Color := CLR_INPUT_TEXT; Ed.Font.Name := UI_FONT; @@ -2594,7 +2595,7 @@ begin MakeLbl(Grp, 'Password:', GRP_PAD, Y + 4, LBL_W); Ed := TFlatEdit.Create(Self); Ed.Parent := Grp; - Ed.SetBounds(GRP_PAD + LBL_W + 12, Y, ED_W, BTN_H); + Ed.SetBounds(DpiScale(GRP_PAD + LBL_W + 12), DpiScale(Y), DpiScale(ED_W), DpiScale(BTN_H)); Ed.Color := CLR_INPUT; Ed.Font.Color := CLR_INPUT_TEXT; Ed.Font.Name := UI_FONT; @@ -3455,7 +3456,7 @@ begin begin Parent := FPageCAT; Caption := 'CAT'; - SetBounds(MARGIN, 18, 400, 28); + SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(400), DpiScale(28)); Font.Name := UI_FONT; Font.Size := 16; Font.Style := [fsBold]; Font.Color := CLR_TEXT; end; @@ -3463,7 +3464,7 @@ begin begin Parent := FPageCAT; Caption := 'Computer Aided Transceiver — serial port and TCP server settings.'; - SetBounds(MARGIN, 48, 680, 20); + SetBounds(DpiScale(MARGIN), DpiScale(48), DpiScale(680), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; end; @@ -3479,7 +3480,7 @@ begin Chk := TFlatCheckBox.Create(Self); Chk.Parent := Grp; Chk.Caption := 'Enable'; - Chk.SetBounds(PAD, R1, GRP_W - PAD * 2, 22); + Chk.SetBounds(DpiScale(PAD), DpiScale(R1), DpiScale(GRP_W - PAD * 2), DpiScale(22)); Chk.Font.Color := CLR_TEXT; Chk.Font.Name := UI_FONT; Chk.Font.Size := 9; Chk.Tag := i; @@ -3489,7 +3490,7 @@ begin MakeLbl(Grp, 'Port:', PAD, R1 + STEP + 6, LW); Ed := TFlatEdit.Create(Self); Ed.Parent := Grp; - Ed.SetBounds(CX, R1 + STEP, EDT_W, BTN_H); + Ed.SetBounds(DpiScale(CX), DpiScale(R1 + STEP), DpiScale(EDT_W), DpiScale(BTN_H)); Ed.Color := CLR_INPUT; Ed.Font.Color := CLR_INPUT_TEXT; Ed.Font.Name := UI_FONT; Ed.Font.Size := 9; Ed.Tag := i; @@ -3532,7 +3533,7 @@ begin Chk := TFlatCheckBox.Create(Self); Chk.Parent := Grp; Chk.Caption := 'Andromeda / G2 front panel'; - Chk.SetBounds(PAD, R1 + 6 * STEP, GRP_W - PAD * 2, 22); + Chk.SetBounds(DpiScale(PAD), DpiScale(R1 + 6 * STEP), DpiScale(GRP_W - PAD * 2), DpiScale(22)); Chk.Font.Color := CLR_TEXT; Chk.Font.Name := UI_FONT; Chk.Font.Size := 9; Chk.Tag := i; @@ -3547,7 +3548,7 @@ begin FCATTcpEn := TFlatCheckBox.Create(Self); FCATTcpEn.Parent := Grp; FCATTcpEn.Caption := 'Enable TCP server (default port 19090)'; - FCATTcpEn.SetBounds(PAD, R1, 300, 22); + FCATTcpEn.SetBounds(DpiScale(PAD), DpiScale(R1), DpiScale(300), DpiScale(22)); FCATTcpEn.Font.Color := CLR_TEXT; FCATTcpEn.Font.Name := UI_FONT; FCATTcpEn.Font.Size := 9; FCATTcpEn.OnChange := OnCATTcpChange; @@ -3555,7 +3556,7 @@ begin MakeLbl(Grp, 'Port:', PAD, R1 + STEP + 6, LW); Spin := TFlatSpinEdit.Create(Self); Spin.Parent := Grp; - Spin.SetBounds(CX, R1 + STEP, 100, BTN_H + 2); + Spin.SetBounds(DpiScale(CX), DpiScale(R1 + STEP), DpiScale(100), DpiScale(BTN_H + 2)); Spin.Color := CLR_INPUT; Spin.Font.Color := CLR_INPUT_TEXT; Spin.Font.Name := UI_FONT; Spin.Font.Size := 9; Spin.MinValue := 1; Spin.MaxValue := 65535; @@ -3678,7 +3679,7 @@ begin begin Parent := FPageSlices; Caption := 'Slices'; - SetBounds(MARGIN, 18, 400, 28); + SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(400), DpiScale(28)); Font.Name := UI_FONT; Font.Size := 16; Font.Style := [fsBold]; Font.Color := CLR_TEXT; end; @@ -3687,7 +3688,7 @@ begin Parent := FPageSlices; Caption := 'A separate CAT TCP port per additional slice — external software ' + 'controls its own slice as a standalone transceiver.'; - SetBounds(MARGIN, 48, 760, 20); + SetBounds(DpiScale(MARGIN), DpiScale(48), DpiScale(760), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; end; with TLabel.Create(Self) do @@ -3695,7 +3696,7 @@ begin Parent := FPageSlices; Caption := 'Slice A is the main receiver — it is configured on the CAT tab ' + '(serial ports and the main TCP port).'; - SetBounds(MARGIN, 66, 760, 20); + SetBounds(DpiScale(MARGIN), DpiScale(66), DpiScale(760), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; end; @@ -3711,7 +3712,7 @@ begin Chk := TFlatCheckBox.Create(Self); Chk.Parent := Grp; Chk.Caption := 'Enable CAT TCP server'; - Chk.SetBounds(PAD, R1, GRP_W - PAD * 2, 22); + Chk.SetBounds(DpiScale(PAD), DpiScale(R1), DpiScale(GRP_W - PAD * 2), DpiScale(22)); Chk.Font.Color := CLR_TEXT; Chk.Font.Name := UI_FONT; Chk.Font.Size := 9; Chk.Tag := i; @@ -3721,7 +3722,7 @@ begin MakeLbl(Grp, 'Port:', PAD, R1 + STEP + 6, LW); Spin := TFlatSpinEdit.Create(Self); Spin.Parent := Grp; - Spin.SetBounds(CX, R1 + STEP, 100, BTN_H + 2); + Spin.SetBounds(DpiScale(CX), DpiScale(R1 + STEP), DpiScale(100), DpiScale(BTN_H + 2)); Spin.Color := CLR_INPUT; Spin.Font.Color := CLR_INPUT_TEXT; Spin.Font.Name := UI_FONT; Spin.Font.Size := 9; Spin.MinValue := 1; Spin.MaxValue := 65535; @@ -3737,7 +3738,7 @@ begin Chk := TFlatCheckBox.Create(Self); Chk.Parent := Grp; Chk.Caption := 'Auto TX'; - Chk.SetBounds(PAD, R1 + 2 * STEP, GRP_W - PAD * 2, 22); + Chk.SetBounds(DpiScale(PAD), DpiScale(R1 + 2 * STEP), DpiScale(GRP_W - PAD * 2), DpiScale(22)); Chk.Font.Color := CLR_TEXT; Chk.Font.Name := UI_FONT; Chk.Font.Size := 9; Chk.Tag := i; @@ -3770,7 +3771,7 @@ begin Parent := FPageSlices; Caption := 'Audio out/in belong to the slice letter: the setting moves the ' + 'slice sitting on that slot right away and the next one inherits it.'; - SetBounds(MARGIN, gy, 760, 20); + SetBounds(DpiScale(MARGIN), DpiScale(gy), DpiScale(760), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; end; Inc(gy, 18); @@ -3779,7 +3780,7 @@ begin Parent := FPageSlices; Caption := 'Only one slice transmits at a time: while anything is already on ' + 'the air the request is ignored — no take-over.'; - SetBounds(MARGIN, gy, 760, 20); + SetBounds(DpiScale(MARGIN), DpiScale(gy), DpiScale(760), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; end; with TLabel.Create(Self) do @@ -3787,7 +3788,7 @@ begin Parent := FPageSlices; Caption := 'Without Auto TX a slice keys up over CAT only when it is already ' + 'the transmit source (TX badge on the slice flag).'; - SetBounds(MARGIN, gy + 18, 760, 20); + SetBounds(DpiScale(MARGIN), DpiScale(gy + 18), DpiScale(760), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; end; with TLabel.Create(Self) do @@ -3795,7 +3796,7 @@ begin Parent := FPageSlices; Caption := 'The port is opened even when the slice does not exist yet — until ' + 'it is created CAT answers "radio off" (PS0).'; - SetBounds(MARGIN, gy + 36, 760, 20); + SetBounds(DpiScale(MARGIN), DpiScale(gy + 36), DpiScale(760), DpiScale(20)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; end; end; @@ -3916,7 +3917,7 @@ var begin Result := TPanel.Create(Self); Result.Parent := AParent; - Result.SetBounds(AX, AY, AW, 20); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(AW), DpiScale(20)); Result.BevelOuter := bvNone; Result.Color := CLR_PANEL; Result.Caption := ''; @@ -3927,7 +3928,7 @@ var Result := TFlatRadioButton.Create(Self); Result.Parent := AParent; Result.Caption := ''; - Result.SetBounds(AX, 0, 22, 20); + Result.SetBounds(DpiScale(AX), DpiScale(0), DpiScale(22), DpiScale(20)); Result.Font.Color := CLR_TEXT; Result.Font.Name := UI_FONT; Result.Font.Size := 9; @@ -3940,7 +3941,7 @@ var Result := TFlatCheckBox.Create(Self); Result.Parent := AParent; Result.Caption := ACap; - Result.SetBounds(AX, AY, AW, 20); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(AW), DpiScale(20)); Result.Font.Color := CLR_TEXT; Result.Font.Name := UI_FONT; Result.Font.Size := 9; @@ -3953,7 +3954,7 @@ var Result := TFlatRadioButton.Create(Self); Result.Parent := AParent; Result.Caption := ''; - Result.SetBounds(AX, 0, 22, 20); + Result.SetBounds(DpiScale(AX), DpiScale(0), DpiScale(22), DpiScale(20)); Result.Font.Color := CLR_TEXT; Result.Font.Name := UI_FONT; Result.Font.Size := 9; @@ -3966,7 +3967,7 @@ var Result := TLabel.Create(Self); Result.Parent := AParent; Result.Caption := ACap; - Result.SetBounds(AX, AY, 84, 18); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(84), DpiScale(18)); Result.Font.Name := UI_FONT; Result.Font.Size := 9; Result.Font.Color := CLR_TEXT; @@ -3978,7 +3979,7 @@ var begin Parent := AParent; Caption := ACap; - SetBounds(AX, AY, 30, 16); + SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(30), DpiScale(16)); Font.Name := UI_FONT; Font.Size := 9; Font.Color := CLR_TEXTDIM; @@ -3992,7 +3993,7 @@ begin begin Parent := FPageAlex; Caption := 'Antenna / Alex'; - SetBounds(MARGIN, 18, 500, 28); + SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(500), DpiScale(28)); Font.Name := UI_FONT; Font.Size := 16; Font.Style := [fsBold]; Font.Color := CLR_TEXT; end; @@ -4000,7 +4001,7 @@ begin FAlexSubtitle.Parent := FPageAlex; FAlexSubtitle.Caption := 'Per-band RX/TX antenna and secondary path routing for the Alex filter board.'; - FAlexSubtitle.SetBounds(MARGIN, 48, 680, 20); + FAlexSubtitle.SetBounds(DpiScale(MARGIN), DpiScale(48), DpiScale(680), DpiScale(20)); FAlexSubtitle.Font.Name := UI_FONT; FAlexSubtitle.Font.Size := 9; FAlexSubtitle.Font.Color := CLR_TEXTDIM; @@ -4127,7 +4128,7 @@ begin begin FAntXvtrRow[b] := TPanel.Create(Self); FAntXvtrRow[b].Parent := FPlutoAntGrp; - FAntXvtrRow[b].SetBounds(0, Y, ANT_GRP_W, ANT_ROW_H); + FAntXvtrRow[b].SetBounds(DpiScale(0), DpiScale(Y), DpiScale(ANT_GRP_W), DpiScale(ANT_ROW_H)); FAntXvtrRow[b].BevelOuter := bvNone; FAntXvtrRow[b].Color := CLR_PANEL; FAntXvtrRow[b].Caption := ''; @@ -4195,7 +4196,7 @@ begin end; // Первая строка трансвертеров — сразу под заголовком секции. - if FAntXvtrHdr <> nil then Y := FAntXvtrHdr.Top + ANT_ROW_H - 6 + if FAntXvtrHdr <> nil then Y := FAntXvtrHdr.Top + DpiScale(ANT_ROW_H) - DpiScale(6) else Y := 0; NVis := 0; for b := 0 to CFG_XVTR_COUNT - 1 do @@ -4212,7 +4213,7 @@ begin FAntXvtrTx[b, 0].Checked := A.XvtrTxAnt[b] = 0; FAntXvtrTx[b, 1].Checked := A.XvtrTxAnt[b] = 1; FAntXvtrRow[b].Top := Y; // упаковка подряд, без дыр от выключенных слотов - Inc(Y, ANT_ROW_H); + Inc(Y, DpiScale(ANT_ROW_H)); Inc(NVis); end; if FAntXvtrHdr <> nil then FAntXvtrHdr.Visible := NVis > 0; @@ -4225,10 +4226,10 @@ begin Bands := 0; for b := 0 to CFG_BAND_COUNT - 1 do if FAntRx[b, 0] <> nil then Inc(Bands); - Y := FPlutoAntGrp.Height - PAD; // fallback, если заголовка нет - if (FAntXvtrHdr <> nil) and (Bands > 0) then Y := FAntXvtrHdr.Top - 6; + Y := FPlutoAntGrp.Height - DpiScale(PAD); // fallback, если заголовка нет + if (FAntXvtrHdr <> nil) and (Bands > 0) then Y := FAntXvtrHdr.Top - DpiScale(6); end; - FPlutoAntGrp.Height := Y + PAD; + FPlutoAntGrp.Height := Y + DpiScale(PAD); end; finally FLoading := False; @@ -4413,7 +4414,7 @@ var begin Result := TFlatFloatSpinEdit.Create(Self); Result.Parent := AParent; - Result.SetBounds(AX, AY, AW, BTN_H); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(AW), DpiScale(BTN_H)); Result.MinValue := AMin; Result.MaxValue := AMax; Result.Increment := AStep; @@ -4430,7 +4431,7 @@ var begin Result := TFlatSpinEdit.Create(Self); Result.Parent := AParent; - Result.SetBounds(AX, AY, AW, BTN_H); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(AW), DpiScale(BTN_H)); Result.MinValue := AMin; Result.MaxValue := AMax; Result.Color := CLR_INPUT; @@ -4446,7 +4447,7 @@ var Result := TFlatCheckBox.Create(Self); Result.Parent := AParent; Result.Caption := ''; - Result.SetBounds(AX, AY, 22, 20); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(22), DpiScale(20)); Result.Font.Color := CLR_TEXT; Result.Font.Name := UI_FONT; Result.Font.Size := 9; @@ -4457,7 +4458,7 @@ var begin Result := TFlatEdit.Create(Self); Result.Parent := AParent; - Result.SetBounds(AX, AY, AW, BTN_H); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(AW), DpiScale(BTN_H)); Result.Color := CLR_INPUT; Result.Font.Color := CLR_INPUT_TEXT; Result.Font.Name := UI_FONT; @@ -4470,7 +4471,7 @@ var begin Result := TFlatComboBox.Create(Self); Result.Parent := AParent; - Result.SetBounds(AX, AY, AW, BTN_H); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(AW), DpiScale(BTN_H)); Result.Color := CLR_INPUT; Result.Font.Color := CLR_INPUT_TEXT; Result.Font.Name := UI_FONT; @@ -4486,7 +4487,7 @@ var Result.Parent := AParent; Result.Caption := Cap; Result.AutoSize := False; - Result.SetBounds(AX, AY, AW, 28); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(AW), DpiScale(28)); Result.Alignment := taCenter; Result.Layout := tlCenter; Result.WordWrap := True; @@ -4502,7 +4503,7 @@ begin L := TLabel.Create(Self); L.Parent := FPageXvtr; L.Caption := 'Transverters'; - L.SetBounds(MARGIN, 18, 500, 28); + L.SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(500), DpiScale(28)); L.Font.Name := UI_FONT; L.Font.Size := 16; L.Font.Style := [fsBold]; L.Font.Color := CLR_TEXT; @@ -4511,7 +4512,7 @@ begin L.Caption := 'Configure up to 8 transverter (XVTR) bands. When a band is selected on the main form, ' + 'the VFO shows the displayed (RF) frequency.' + LineEnding + 'The radio is internally tuned to the IF: f_IF = f_displayed - LO + LO Error.'; - L.SetBounds(MARGIN, 50, GRP_W, 34); + L.SetBounds(DpiScale(MARGIN), DpiScale(50), DpiScale(GRP_W), DpiScale(34)); L.Font.Name := UI_FONT; L.Font.Size := 9; L.Font.Color := CLR_TEXTDIM; L.WordWrap := True; @@ -4570,7 +4571,7 @@ begin FChkXvtrTunPwr.Parent := GrpOpts; FChkXvtrTunPwr.Caption := 'Use XVTR power for TUN ' + '(TUN button uses the per-slot TX Power instead of the global TUN Level)'; - FChkXvtrTunPwr.SetBounds(14, GRP_TITLE_H + 8, GRP_W - 28, 20); + FChkXvtrTunPwr.SetBounds(DpiScale(14), DpiScale(GRP_TITLE_H + 8), DpiScale(GRP_W - 28), DpiScale(20)); FChkXvtrTunPwr.Font.Color := CLR_TEXT; FChkXvtrTunPwr.Font.Name := UI_FONT; FChkXvtrTunPwr.Font.Size := 9; @@ -4586,7 +4587,7 @@ begin 'XVTR RF - use the main HF RF path.' + LineEnding + 'Disable PA - keep the internal PA in RX position during TX. ' + 'RX Antenna - override the per-band antenna for this slot.'; - L.SetBounds(MARGIN, GrpY + GRP_TITLE_H + 36 + 16, GRP_W, 52); + L.SetBounds(DpiScale(MARGIN), DpiScale(GrpY + GRP_TITLE_H + 36 + 16), DpiScale(GRP_W), DpiScale(52)); L.Font.Name := UI_FONT; L.Font.Size := 9; L.Font.Color := CLR_TEXTDIM; L.WordWrap := True; @@ -4740,7 +4741,7 @@ var Result := TFlatCheckBox.Create(Self); Result.Parent := AParent; Result.Caption := ''; - Result.SetBounds(AX, AY, PIN_W, 20); + Result.SetBounds(DpiScale(AX), DpiScale(AY), DpiScale(PIN_W), DpiScale(20)); Result.Font.Color := CLR_TEXT; Result.Font.Name := UI_FONT; Result.Font.Size := 9; @@ -4754,7 +4755,7 @@ begin begin Parent := FPageOC; Caption := 'OC Control'; - SetBounds(MARGIN, 18, 500, 28); + SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(500), DpiScale(28)); Font.Name := UI_FONT; Font.Size := 16; Font.Style := [fsBold]; Font.Color := CLR_TEXT; end; @@ -4762,7 +4763,7 @@ begin FOCSubtitle.Parent := FPageOC; FOCSubtitle.Caption := 'Open Collector outputs (Penny/Alex board), per-band and per-transverter. openHPSDR only.'; - FOCSubtitle.SetBounds(MARGIN, 48, 680, 20); + FOCSubtitle.SetBounds(DpiScale(MARGIN), DpiScale(48), DpiScale(680), DpiScale(20)); FOCSubtitle.Font.Name := UI_FONT; FOCSubtitle.Font.Size := 9; FOCSubtitle.Font.Color := CLR_TEXTDIM; @@ -4770,7 +4771,7 @@ begin FOCEnabled := TFlatCheckBox.Create(Self); FOCEnabled.Parent := FPageOC; FOCEnabled.Caption := 'Enable OC Control'; - FOCEnabled.SetBounds(MARGIN, 76, 220, 22); + FOCEnabled.SetBounds(DpiScale(MARGIN), DpiScale(76), DpiScale(220), DpiScale(22)); FOCEnabled.Font.Color := CLR_TEXT; FOCEnabled.Font.Name := UI_FONT; FOCEnabled.Font.Size := 9; @@ -4958,7 +4959,7 @@ var begin Result := TFlatFloatSpinEdit.Create(Self); Result.Parent := Grp; - Result.SetBounds(ED_X, AY, ED_W, BTN_H); + Result.SetBounds(DpiScale(ED_X), DpiScale(AY), DpiScale(ED_W), DpiScale(BTN_H)); Result.MinValue := AMin; Result.MaxValue := AMax; Result.Increment := AStep; Result.DecimalPlaces := ADec; Result.Color := CLR_INPUT; Result.Font.Color := CLR_INPUT_TEXT; @@ -4970,7 +4971,7 @@ var begin L := TLabel.Create(Self); L.Parent := Grp; L.Caption := Cap; - L.SetBounds(LBL_X, AY + 4, LBL_W, 18); + L.SetBounds(DpiScale(LBL_X), DpiScale(AY + 4), DpiScale(LBL_W), DpiScale(18)); L.Font.Color := CLR_TEXTDIM; L.Font.Name := UI_FONT; L.Font.Size := 9; end; @@ -4979,7 +4980,7 @@ begin try L := TLabel.Create(Self); L.Parent := FPageQO; L.Caption := 'QO-100 (Es''hail-2 NB transponder)'; - L.SetBounds(MARGIN, 18, 600, 28); + L.SetBounds(DpiScale(MARGIN), DpiScale(18), DpiScale(600), DpiScale(28)); L.Font.Name := UI_FONT; L.Font.Size := 16; L.Font.Style := [fsBold]; L.Font.Color := CLR_TEXT; @@ -4988,7 +4989,7 @@ begin L.Caption := 'Geostationary transponder: RX downlink (~10489.5 MHz) via LNB, ' + 'TX uplink (~2400 MHz) direct. VFO is displayed in downlink terms; ' + 'RX and TX use separate LOs. Drift is corrected by the beacon lock.'; - L.SetBounds(MARGIN, 50, 700, 34); + L.SetBounds(DpiScale(MARGIN), DpiScale(50), DpiScale(700), DpiScale(34)); L.Font.Name := UI_FONT; L.Font.Size := 9; L.Font.Color := CLR_TEXTDIM; L.WordWrap := True; @@ -4997,7 +4998,7 @@ begin Y := GRP_TITLE_H + 8; FQoEn := TFlatCheckBox.Create(Self); FQoEn.Parent := Grp; FQoEn.Caption := 'Enable QO-100 band'; - FQoEn.SetBounds(LBL_X, Y, 300, 20); + FQoEn.SetBounds(DpiScale(LBL_X), DpiScale(Y), DpiScale(300), DpiScale(20)); FQoEn.Font.Color := CLR_TEXT; FQoEn.Font.Name := UI_FONT; FQoEn.Font.Size := 9; FQoEn.OnChange := OnQOAnyChange; @@ -5032,7 +5033,7 @@ begin Inc(Y, 30); QoLabel('TX drive ceiling (%)', Y); FQoPower := TFlatSpinEdit.Create(Self); - FQoPower.Parent := Grp; FQoPower.SetBounds(ED_X, Y, ED_W, BTN_H); + FQoPower.Parent := Grp; FQoPower.SetBounds(DpiScale(ED_X), DpiScale(Y), DpiScale(ED_W), DpiScale(BTN_H)); FQoPower.MinValue := 0; FQoPower.MaxValue := 100; FQoPower.Value := 100; FQoPower.Color := CLR_INPUT; FQoPower.Font.Color := CLR_INPUT_TEXT; FQoPower.Font.Name := UI_FONT; FQoPower.Font.Size := 9; @@ -5040,7 +5041,7 @@ begin FQoInfo := TLabel.Create(Self); FQoInfo.Parent := FPageQO; - FQoInfo.SetBounds(MARGIN, 100 + GRP_TITLE_H + 9 * 30 + 28, 700, 52); + FQoInfo.SetBounds(DpiScale(MARGIN), DpiScale(100 + GRP_TITLE_H + 9 * 30 + 28), DpiScale(700), DpiScale(52)); FQoInfo.Font.Color := CLR_TEXTDIM; FQoInfo.Font.Name := 'Courier New'; FQoInfo.Font.Size := 9; FQoInfo.WordWrap := True; finally diff --git a/ewsdr.lpi b/ewsdr.lpi index d457312..121a566 100644 --- a/ewsdr.lpi +++ b/ewsdr.lpi @@ -17,9 +17,9 @@ - + - + @@ -140,6 +140,12 @@ + + + + + +