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 @@
+
+
+
+
+
+