From ece5a700410610458a5ced9b4efce49ce0a44966 Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Thu, 30 Apr 2026 10:24:10 +0300 Subject: [PATCH] new layout --- FlatButton.pas | 12 ++- MainForm.pas | 259 +++++++++++++++++++++++++++++++------------------ 2 files changed, 173 insertions(+), 98 deletions(-) diff --git a/FlatButton.pas b/FlatButton.pas index 0d2ccc1..bcfc5c4 100644 --- a/FlatButton.pas +++ b/FlatButton.pas @@ -83,6 +83,8 @@ begin end; procedure TFlatButton.Paint; +const + CORNER = 3; var R: TRect; TW, TH: Integer; @@ -90,21 +92,21 @@ var begin R := ClientRect; - // Фон if FActive then BG := FClrActive else if FHot then BG := FClrHot else BG := FClrNorm; + // Фон со скруглёнными углами Canvas.Brush.Color := BG; Canvas.Brush.Style := bsSolid; - Canvas.Pen.Style := psClear; - Canvas.FillRect(R); + Canvas.Pen.Color := BG; + Canvas.Pen.Style := psSolid; + Canvas.RoundRect(R.Left, R.Top, R.Right, R.Bottom, CORNER * 2, CORNER * 2); // Рамка - Canvas.Pen.Style := psSolid; Canvas.Pen.Color := FClrBorder; Canvas.Brush.Style := bsClear; - Canvas.Rectangle(R); + Canvas.RoundRect(R.Left, R.Top, R.Right - 1, R.Bottom - 1, CORNER * 2, CORNER * 2); // Текст if FActive then Canvas.Font.Color := FClrTextAct diff --git a/MainForm.pas b/MainForm.pas index 5b050c3..57eeaa6 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -33,19 +33,20 @@ uses SpectrumView; const - CLR_BG = TColor($00101010); - CLR_PANEL = TColor($00181818); - CLR_BORDER = TColor($00303030); - CLR_FREQ = TColor($0000FF00); - CLR_FREQ_DIM = TColor($00008000); - CLR_AMBER = TColor($0000AAFF); - CLR_ACTIVE = TColor($00003300); - CLR_INACTIVE = TColor($00202020); - CLR_TEXT = TColor($00CCCCCC); - CLR_TEXTDIM = TColor($00666666); - CLR_METER_ON = TColor($0000CC44); - CLR_METER_OVR= TColor($000000CC); - CLR_SPECTRUM = TColor($0044FF44); + CLR_BG = TColor($00101010); + CLR_PANEL = TColor($00181818); + CLR_BORDER = TColor($00303030); + CLR_FREQ = TColor($0000FF00); + CLR_FREQ_DIM = TColor($00007800); + CLR_AMBER = TColor($0000AAFF); + CLR_ACTIVE = TColor($000C3010); + CLR_ACTIVE_BDR = TColor($00387838); + CLR_INACTIVE = TColor($001A1A1A); + CLR_TEXT = TColor($00CCCCCC); + CLR_TEXTDIM = TColor($00666666); + CLR_METER_ON = TColor($0000CC44); + CLR_METER_OVR = TColor($000000CC); + CLR_SPECTRUM = TColor($0044FF44); WDSP_WISDOM_FILE = 'wdspWisdom00'; BAND_COUNT = 11; @@ -261,6 +262,7 @@ type BtnDiscover: TFlatButton; BtnStartStop: TFlatButton; // START / STOP (connect+run в одном) BtnSettings: TFlatButton; // открыть диалог настроек + PanelSep: TPanel; // 1px разделитель под тулбаром // ---- Left panel ---- PanelLeft: TPanel; @@ -1257,12 +1259,28 @@ begin PanelToolbar.Align := alTop; PanelToolbar.Height := 36; PanelToolbar.BevelOuter := bvNone; + PanelToolbar.Color := CLR_PANEL; + X := 4; BtnDiscover := MakeBtn(PanelToolbar, 'DISCOVER', X, 3, 80, BTN_H, BtnDiscoverClick); BtnStartStop := MakeBtn(PanelToolbar, 'START', X+84, 3, 76, BTN_H, BtnStartStopClick); BtnSettings := MakeBtn(PanelToolbar, 'SETUP', X+164, 3, 66, BTN_H, BtnSettingsClick); + // DISCOVER — синеватый акцент + BtnDiscover.ClrNorm := TColor($00101828); + BtnDiscover.ClrHot := TColor($00182038); + BtnDiscover.ClrActive := TColor($00182038); + BtnDiscover.ClrBorder := TColor($00304860); + BtnDiscover.ClrText := TColor($0090B8D0); + BtnDiscover.ClrTextAct := TColor($00B0D0F0); + // START/STOP — зелёный тон в обоих состояниях + BtnStartStop.ClrNorm := TColor($00101810); + BtnStartStop.ClrBorder := TColor($00304830); + BtnStartStop.ClrText := TColor($0090C090); + + // ---- Separator line ---- + // ---- Status bar ---- StatusBar1 := TStatusBar.Create(Self); StatusBar1.Parent := Self; @@ -1284,14 +1302,14 @@ begin PanelLeft.Width := LEFT_W; PanelLeft.BevelOuter := bvNone; - Y := 2; + Y := 38; // gap below separator: separator at y=66, content starts at y=74 // Compact top VFO group PanelTopVfoGroup := TPanel.Create(Self); PanelTopVfoGroup.Parent := Self; PanelTopVfoGroup.SetBounds(0, 0, TOP_VFO_W * 2 + 64, 60); PanelTopVfoGroup.BevelOuter := bvNone; - PanelTopVfoGroup.Color := CLR_PANEL; + PanelTopVfoGroup.Color := TColor($00181818); // VFO A PanelTopVfoA := TPanel.Create(Self); @@ -1305,9 +1323,9 @@ begin PanelVfoA.SetBounds(0, 0, TOP_VFO_W, TOP_VFO_FREQ_H); PanelVfoA.BevelOuter := bvNone; - BtnTopVfoASelect := MakeBtn(PanelVfoA, 'A', 0, 7, 18, 16, BtnTopVfoASelectClick); + BtnTopVfoASelect := MakeBtn(PanelVfoA, 'A', 0, 5, 20, 18, BtnTopVfoASelectClick); BtnTopVfoASelect.Font.Name := 'Courier New'; - BtnTopVfoASelect.Font.Size := 6; + BtnTopVfoASelect.Font.Size := 7; BtnTopVfoASelect.Font.Bold := True; BtnTopVfoASelect.ClrNorm := TColor($00303030); BtnTopVfoASelect.ClrHot := TColor($00404040); @@ -1316,9 +1334,9 @@ begin BtnTopVfoASelect.ClrText := CLR_TEXTDIM; BtnTopVfoASelect.ClrTextAct := CLR_TEXT; - BtnTopVfoATX := MakeBtn(PanelVfoA, 'TX', 0, 25, 18, 16, BtnTopVfoATXClick); + BtnTopVfoATX := MakeBtn(PanelVfoA, 'TX', 0, 25, 20, 18, BtnTopVfoATXClick); BtnTopVfoATX.Font.Name := 'Courier New'; - BtnTopVfoATX.Font.Size := 6; + BtnTopVfoATX.Font.Size := 7; BtnTopVfoATX.Font.Bold := True; BtnTopVfoATX.ClrNorm := TColor($00303030); BtnTopVfoATX.ClrHot := TColor($00404040); @@ -1362,9 +1380,9 @@ begin PanelVfoB.SetBounds(0, 0, TOP_VFO_W, TOP_VFO_FREQ_H); PanelVfoB.BevelOuter := bvNone; - BtnTopVfoBSelect := MakeBtn(PanelVfoB, 'B', 0, 7, 18, 16, BtnTopVfoBSelectClick); + BtnTopVfoBSelect := MakeBtn(PanelVfoB, 'B', 0, 5, 20, 18, BtnTopVfoBSelectClick); BtnTopVfoBSelect.Font.Name := 'Courier New'; - BtnTopVfoBSelect.Font.Size := 6; + BtnTopVfoBSelect.Font.Size := 7; BtnTopVfoBSelect.Font.Bold := True; BtnTopVfoBSelect.ClrNorm := TColor($00303030); BtnTopVfoBSelect.ClrHot := TColor($00404040); @@ -1373,9 +1391,9 @@ begin BtnTopVfoBSelect.ClrText := CLR_TEXTDIM; BtnTopVfoBSelect.ClrTextAct := CLR_TEXT; - BtnTopVfoBTX := MakeBtn(PanelVfoB, 'TX', 0, 25, 18, 16, BtnTopVfoBTXClick); + BtnTopVfoBTX := MakeBtn(PanelVfoB, 'TX', 0, 25, 20, 18, BtnTopVfoBTXClick); BtnTopVfoBTX.Font.Name := 'Courier New'; - BtnTopVfoBTX.Font.Size := 6; + BtnTopVfoBTX.Font.Size := 7; BtnTopVfoBTX.Font.Bold := True; BtnTopVfoBTX.ClrNorm := TColor($00303030); BtnTopVfoBTX.ClrHot := TColor($00404040); @@ -1407,18 +1425,23 @@ begin FreqDispB.OnChange := FreqDispBChanged; FreqDispB.OnClick := FreqDispBClick; - // VFO transfer buttons (between A and B) + // VFO transfer buttons — горизонтальный ряд по центру PanelVfoButtons := TPanel.Create(Self); PanelVfoButtons.Parent := PanelTopVfoGroup; - PanelVfoButtons.SetBounds(0, 0, 56, 60); + PanelVfoButtons.SetBounds(0, 0, 140, 20); PanelVfoButtons.BevelOuter := bvNone; + PanelVfoButtons.Color := TColor($00181818); - BtnVfoSwap := MakeBtn(PanelVfoButtons, 'A<>B', 0, 0, 52, TOP_VFO_BTN_H, BtnVfoSwapClick); - BtnVfoACopyB := MakeBtn(PanelVfoButtons, 'A>B', 0, 0, 52, TOP_VFO_BTN_H, BtnVfoACopyBClick); - BtnVfoBCopyA := MakeBtn(PanelVfoButtons, 'B>A', 0, 0, 52, TOP_VFO_BTN_H, BtnVfoBCopyAClick); - BtnVfoSwap.Font.Size := 6; - BtnVfoACopyB.Font.Size := 6; - BtnVfoBCopyA.Font.Size := 6; + BtnVfoACopyB := MakeBtn(PanelVfoButtons, 'A>B', 0, 0, 44, 20, BtnVfoACopyBClick); + BtnVfoSwap := MakeBtn(PanelVfoButtons, 'A<>B', 0, 0, 44, 20, BtnVfoSwapClick); + BtnVfoBCopyA := MakeBtn(PanelVfoButtons, 'B>A', 0, 0, 44, 20, BtnVfoBCopyAClick); + // Янтарный стиль, шрифт под размер кнопок + StyleSpanButton(BtnVfoACopyB, False); + StyleSpanButton(BtnVfoSwap, False); + StyleSpanButton(BtnVfoBCopyA, False); + BtnVfoACopyB.Font.Size := 7; + BtnVfoSwap.Font.Size := 7; + BtnVfoBCopyA.Font.Size := 7; LayoutTopVfoBlock; @@ -1598,7 +1621,7 @@ begin PanelSpanButtons := TPanel.Create(Self); PanelSpanButtons.Parent := PanelRight; PanelSpanButtons.Align := alTop; - PanelSpanButtons.Height := 30; + PanelSpanButtons.Height := 38; PanelSpanButtons.BevelOuter := bvNone; LblSpan := TLabel.Create(Self); @@ -1635,6 +1658,15 @@ begin BtnHidePanel.ClrTextAct := TColor($00F0FAFF); BtnHidePanel.BringToFront; + // Разделитель: на уровне формы, под всеми верхними элементами + PanelSep := TPanel.Create(Self); + PanelSep.Parent := Self; + PanelSep.Align := alNone; + PanelSep.BevelOuter := bvNone; + PanelSep.ParentColor := False; + PanelSep.Color := TColor($00606060); + PanelSep.SetBounds(0, PanelToolbar.Height + 30, ClientWidth, 2); + // Большой S-метр — на главной форме поверх двух панелей // S-метр: Parent=Self, перекрывает Toolbar+SpanButtons вертикально PanelSMeterRight := TPanel.Create(Self); @@ -1798,33 +1830,24 @@ const MARGIN = 4; TOP_OFFSET = 2; TOP_VFO_FREQ_H = 47; - VFO_BTN_W = 18; + VFO_BTN_W = 20; VFO_BTN_FREQ_GAP = 4; VFO_FREQ_LEFT_PAD = 2; VFO_FREQ_RIGHT_PAD = 8; - TRANSFER_LEFT_GAP = 12; - TRANSFER_RIGHT_GAP = 24; - TRANSFER_W = 52; - TRANSFER_BTN_H = 16; - TRANSFER_BTN_GAP = 3; - SETTINGS_GAP = 4; + XFER_BTN_W = 44; + XFER_BTN_H = 20; + XFER_BTN_GAP = 4; + XFER_PANEL_W = XFER_BTN_W * 3 + XFER_BTN_GAP * 2; // = 140 + XFER_SIDE_GAP = 14; // минимальный зазор между VFO и кнопками трансфера + SETTINGS_GAP = 8; + MAX_SPREAD = 100; // максимальный дополнительный отступ с каждой стороны при растяжении + // VFO-B получает левый отступ = правому паддингу VFO-A для симметрии зазоров + VFO_B_LEFT_PAD = VFO_FREQ_LEFT_PAD + VFO_FREQ_RIGHT_PAD; // = 10 var - BlockH: Integer; - BtnY: Integer; - FreqTop: Integer; - SafeLeft: Integer; - SafeRight: Integer; - GroupLeft: Integer; - GroupTop: Integer; - RightW: Integer; - SMW: Integer; - SMLeft: Integer; - TopVfoAW: Integer; - TopVfoBW: Integer; - NeedFreqAW: Integer; - NeedFreqBW: Integer; - FreqTextW: Integer; - GroupW: Integer; + BlockH, FreqTop, SafeLeft, SafeRight, GroupLeft, GroupTop: Integer; + RightW, SMW, SMLeft, AvailW, MinGroupW, ExtraPerSide, DynGap: Integer; + TopVfoAW, TopVfoBW, NeedFreqAW, NeedFreqBW, FreqTextW, GroupW: Integer; + XferX, XferY: Integer; begin if (PanelToolbar = nil) or (PanelSpanButtons = nil) or (PanelTopVfoGroup = nil) or (PanelTopVfoA = nil) or (PanelTopVfoB = nil) then Exit; @@ -1833,14 +1856,15 @@ begin Canvas.Font.Size := FreqDispB.FontSize; Canvas.Font.Style := [fsBold]; FreqDispA.Left := VFO_BTN_W + VFO_BTN_FREQ_GAP - VFO_FREQ_LEFT_PAD; - FreqDispB.Left := VFO_BTN_W + VFO_BTN_FREQ_GAP - VFO_FREQ_LEFT_PAD; - FreqTextW := Canvas.TextWidth('000.000.000'); + FreqDispB.Left := VFO_B_LEFT_PAD + VFO_BTN_W + VFO_BTN_FREQ_GAP - VFO_FREQ_LEFT_PAD; + FreqTextW := Canvas.TextWidth('000.000.000'); NeedFreqAW := FreqDispA.Left + FreqTextW + VFO_FREQ_LEFT_PAD + VFO_FREQ_RIGHT_PAD; NeedFreqBW := FreqDispB.Left + FreqTextW + VFO_FREQ_LEFT_PAD + VFO_FREQ_RIGHT_PAD; TopVfoAW := NeedFreqAW; TopVfoBW := NeedFreqBW; - GroupW := TopVfoAW + TRANSFER_LEFT_GAP + TRANSFER_W + - TRANSFER_RIGHT_GAP + TopVfoBW; + + // Минимальная ширина компактной группы + MinGroupW := TopVfoAW + XFER_SIDE_GAP + XFER_PANEL_W + XFER_SIDE_GAP + TopVfoBW; SafeLeft := MARGIN; if BtnSettings <> nil then @@ -1851,57 +1875,67 @@ begin RightW := ClientWidth - PanelLeft.Width; if RightW > 200 then begin - SMW := Round(RightW * SMETER_WIDTH_RATIO); + SMW := Round(RightW * SMETER_WIDTH_RATIO); SMLeft := ClientWidth - SMW - SMETER_MARGIN; SafeRight := Min(SafeRight, SMLeft - TOP_SMETER_GAP); end; end; - if SafeLeft + GroupW > SafeRight then + AvailW := SafeRight - SafeLeft; + if AvailW < MinGroupW then begin PanelTopVfoGroup.Visible := False; Exit; end; - PanelTopVfoGroup.Visible := True; - PanelTopVfoA.Visible := True; - PanelTopVfoB.Visible := True; - BlockH := PanelToolbar.Height + PanelSpanButtons.Height - (MARGIN * 2); + // Динамический зазор: растёт с шириной окна, но не больше MAX_SPREAD + ExtraPerSide := Min((AvailW - MinGroupW) div 2, MAX_SPREAD); + DynGap := XFER_SIDE_GAP + ExtraPerSide; + GroupW := TopVfoAW + DynGap + XFER_PANEL_W + DynGap + TopVfoBW; + + BlockH := PanelToolbar.Height + 30 - (MARGIN * 2); // 30 = span row content, not full PanelSpanButtons if BlockH < 56 then BlockH := 56; - GroupLeft := SafeLeft + (SafeRight - SafeLeft - GroupW) div 2; - GroupTop := TOP_OFFSET; + + // Центрируем группу в доступном пространстве + GroupLeft := SafeLeft + (AvailW - GroupW) div 2; + GroupTop := TOP_OFFSET; PanelTopVfoGroup.SetBounds(GroupLeft, GroupTop, GroupW, BlockH); + PanelTopVfoGroup.Visible := True; + + // VFO-A: левый край группы PanelTopVfoA.SetBounds(0, 0, TopVfoAW, BlockH); + PanelTopVfoA.Visible := True; PanelVfoA.SetBounds(0, 0, TopVfoAW, TOP_VFO_FREQ_H); FreqTop := ((BtnTopVfoASelect.Top + BtnTopVfoASelect.Height + BtnTopVfoATX.Top) div 2) - (TOP_VFO_FREQ_H div 2); - FreqDispA.SetBounds(FreqDispA.Left, FreqDispA.Top, + FreqDispA.SetBounds(FreqDispA.Left, FreqTop, FreqTextW + VFO_FREQ_LEFT_PAD + VFO_FREQ_RIGHT_PAD, TOP_VFO_FREQ_H); - FreqDispA.Top := FreqTop; BtnTopVfoASelect.Left := 0; BtnTopVfoATX.Left := 0; - PanelVfoButtons.SetBounds(TopVfoAW + TRANSFER_LEFT_GAP, 0, TRANSFER_W, BlockH); - BtnY := (PanelVfoButtons.Height - (TRANSFER_BTN_H * 3 + TRANSFER_BTN_GAP * 2)) div 2; - if BtnY < 0 then BtnY := 0; - BtnVfoSwap.SetBounds(0, BtnY, TRANSFER_W, TRANSFER_BTN_H); - BtnVfoACopyB.SetBounds(0, BtnY + TRANSFER_BTN_H + TRANSFER_BTN_GAP, - TRANSFER_W, TRANSFER_BTN_H); - BtnVfoBCopyA.SetBounds(0, BtnY + (TRANSFER_BTN_H + TRANSFER_BTN_GAP) * 2, - TRANSFER_W, TRANSFER_BTN_H); + // Кнопки трансфера: горизонтальный ряд, вертикально по центру + XferX := TopVfoAW + DynGap; + XferY := (BlockH - XFER_BTN_H) div 2; + PanelVfoButtons.SetBounds(XferX, XferY, XFER_PANEL_W, XFER_BTN_H); + BtnVfoACopyB.SetBounds(0, 0, XFER_BTN_W, XFER_BTN_H); + BtnVfoSwap.SetBounds(XFER_BTN_W + XFER_BTN_GAP, 0, XFER_BTN_W, XFER_BTN_H); + BtnVfoBCopyA.SetBounds((XFER_BTN_W + XFER_BTN_GAP) * 2, 0, XFER_BTN_W, XFER_BTN_H); - PanelTopVfoB.SetBounds(TopVfoAW + TRANSFER_LEFT_GAP + TRANSFER_W + - TRANSFER_RIGHT_GAP, - 0, TopVfoBW, BlockH); + // VFO-B: правый край группы + PanelTopVfoB.SetBounds(TopVfoAW + DynGap + XFER_PANEL_W + DynGap, 0, TopVfoBW, BlockH); + PanelTopVfoB.Visible := True; PanelVfoB.SetBounds(0, 0, TopVfoBW, TOP_VFO_FREQ_H); FreqTop := ((BtnTopVfoBSelect.Top + BtnTopVfoBSelect.Height + BtnTopVfoBTX.Top) div 2) - (TOP_VFO_FREQ_H div 2); - FreqDispB.SetBounds(FreqDispB.Left, FreqDispB.Top, + FreqDispB.SetBounds(FreqDispB.Left, FreqTop, FreqTextW + VFO_FREQ_LEFT_PAD + VFO_FREQ_RIGHT_PAD, TOP_VFO_FREQ_H); - FreqDispB.Top := FreqTop; - BtnTopVfoBSelect.Left := 0; - BtnTopVfoBTX.Left := 0; + BtnTopVfoBSelect.Left := VFO_B_LEFT_PAD; + BtnTopVfoBTX.Left := VFO_B_LEFT_PAD; + + if PanelSep <> nil then + PanelSep.SetBounds(0, PanelToolbar.Height + 30, ClientWidth, 2); + PanelTopVfoGroup.BringToFront; end; @@ -1934,7 +1968,7 @@ begin // Y: от верха формы+margin до низа PanelSpanButtons-margin SMTop := SMETER_MARGIN; - SMBot := PanelToolbar.Height + PanelSpanButtons.Height - SMETER_MARGIN; + SMBot := PanelToolbar.Height + 30 - SMETER_MARGIN; // 30 = span row content, ends before separator PanelSMeterRight.SetBounds(SMLeft, SMTop, SMW, SMBot - SMTop); PanelSMeterRight.BringToFront; @@ -2110,8 +2144,9 @@ begin B.Active := Active; B.ClrNorm := CLR_INACTIVE; B.ClrActive := CLR_ACTIVE; - B.ClrHot := TColor($00323232); - B.ClrBorder := TColor($00505050); + B.ClrHot := TColor($00282828); + if Active then B.ClrBorder := CLR_ACTIVE_BDR + else B.ClrBorder := TColor($00444444); B.ClrText := CLR_TEXT; B.ClrTextAct := TColor($0000FF88); B.Font.Name := 'Courier New'; @@ -2213,21 +2248,59 @@ begin if FActiveVfo = 0 then begin - // VFO-A активен: яркий зелёный FreqDispA.ColorNormal := CLR_FREQ; FreqDispB.ColorNormal := CLR_FREQ_DIM; LblVfoALabel.Font.Color := CLR_FREQ; LblVfoBLabel.Font.Color := CLR_TEXTDIM; - if BtnTopVfoASelect <> nil then StyleButton(BtnTopVfoASelect, True); - if BtnTopVfoBSelect <> nil then StyleButton(BtnTopVfoBSelect, False); + // Активный VFO-A: зелёный акцент + if BtnTopVfoASelect <> nil then begin + BtnTopVfoASelect.ClrNorm := TColor($00101C10); + BtnTopVfoASelect.ClrActive := TColor($00182818); + BtnTopVfoASelect.ClrHot := TColor($00182818); + BtnTopVfoASelect.ClrBorder := TColor($004A7A4A); + BtnTopVfoASelect.ClrText := TColor($0060B860); + BtnTopVfoASelect.ClrTextAct := TColor($0040FF60); + BtnTopVfoASelect.Active := True; + BtnTopVfoASelect.Invalidate; + end; + // Неактивный VFO-B: приглушённый + if BtnTopVfoBSelect <> nil then begin + BtnTopVfoBSelect.ClrNorm := TColor($001A1A1A); + BtnTopVfoBSelect.ClrActive := TColor($00282828); + BtnTopVfoBSelect.ClrHot := TColor($00252525); + BtnTopVfoBSelect.ClrBorder := TColor($00404040); + BtnTopVfoBSelect.ClrText := CLR_TEXTDIM; + BtnTopVfoBSelect.ClrTextAct := CLR_TEXT; + BtnTopVfoBSelect.Active := False; + BtnTopVfoBSelect.Invalidate; + end; end else begin - // VFO-B активен: яркий зелёный FreqDispA.ColorNormal := CLR_FREQ_DIM; FreqDispB.ColorNormal := CLR_FREQ; LblVfoALabel.Font.Color := CLR_TEXTDIM; LblVfoBLabel.Font.Color := CLR_FREQ; - if BtnTopVfoASelect <> nil then StyleButton(BtnTopVfoASelect, False); - if BtnTopVfoBSelect <> nil then StyleButton(BtnTopVfoBSelect, True); + // Неактивный VFO-A: приглушённый + if BtnTopVfoASelect <> nil then begin + BtnTopVfoASelect.ClrNorm := TColor($001A1A1A); + BtnTopVfoASelect.ClrActive := TColor($00282828); + BtnTopVfoASelect.ClrHot := TColor($00252525); + BtnTopVfoASelect.ClrBorder := TColor($00404040); + BtnTopVfoASelect.ClrText := CLR_TEXTDIM; + BtnTopVfoASelect.ClrTextAct := CLR_TEXT; + BtnTopVfoASelect.Active := False; + BtnTopVfoASelect.Invalidate; + end; + // Активный VFO-B: зелёный акцент + if BtnTopVfoBSelect <> nil then begin + BtnTopVfoBSelect.ClrNorm := TColor($00101C10); + BtnTopVfoBSelect.ClrActive := TColor($00182818); + BtnTopVfoBSelect.ClrHot := TColor($00182818); + BtnTopVfoBSelect.ClrBorder := TColor($004A7A4A); + BtnTopVfoBSelect.ClrText := TColor($0060B860); + BtnTopVfoBSelect.ClrTextAct := TColor($0040FF60); + BtnTopVfoBSelect.Active := True; + BtnTopVfoBSelect.Invalidate; + end; end; if BtnTopVfoATX <> nil then begin