mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 18:43:51 +00:00
Rework S-meter left label zone and bar layout
This commit is contained in:
+49
-28
@@ -937,6 +937,8 @@ var
|
|||||||
Y_BAR_TOP, Y_BAR_BOT: Integer;
|
Y_BAR_TOP, Y_BAR_BOT: Integer;
|
||||||
BarEnd, PeakLeft, PeakRight, S9X, OvrX: Integer;
|
BarEnd, PeakLeft, PeakRight, S9X, OvrX: Integer;
|
||||||
i, X, TW: Integer; Lbl: string; SNum, Over: Integer;
|
i, X, TW: Integer; Lbl: string; SNum, Over: Integer;
|
||||||
|
LblDbm, LblS: string;
|
||||||
|
TWDbm, TWS, TWUnit, LblZoneL, TH10, TH6, MaxTWDbm: Integer;
|
||||||
|
|
||||||
function DBtoX(dB: Double): Integer; inline;
|
function DBtoX(dB: Double): Integer; inline;
|
||||||
begin
|
begin
|
||||||
@@ -960,9 +962,9 @@ begin
|
|||||||
W := R.Right - R.Left; H := R.Bottom - R.Top;
|
W := R.Right - R.Left; H := R.Bottom - R.Top;
|
||||||
ZX1 := 0; ZX2 := 0; ZY1 := 0; ZY2 := 0;
|
ZX1 := 0; ZX2 := 0; ZY1 := 0; ZY2 := 0;
|
||||||
if (W < 80) or (H < 16) then Exit;
|
if (W < 80) or (H < 16) then Exit;
|
||||||
BX := R.Left + LEFT_INFO; BW := W - LEFT_INFO - 4;
|
BX := R.Left + LEFT_INFO; BW := W - LEFT_INFO - 8;
|
||||||
Y_BAR_TOP := R.Top + H * 36 div 100;
|
Y_BAR_TOP := R.Top + H * 44 div 100;
|
||||||
Y_BAR_BOT := R.Top + H * 66 div 100;
|
Y_BAR_BOT := R.Top + H * 58 div 100;
|
||||||
S9X := DBtoX(DB_S9); OvrX := DBtoX(DB_OVR);
|
S9X := DBtoX(DB_S9); OvrX := DBtoX(DB_OVR);
|
||||||
|
|
||||||
ACanvas.Brush.Color := CLR_SMETER_BG; ACanvas.Brush.Style := bsSolid;
|
ACanvas.Brush.Color := CLR_SMETER_BG; ACanvas.Brush.Style := bsSolid;
|
||||||
@@ -990,14 +992,41 @@ begin
|
|||||||
if (PeakRight > BX) and (PeakRight <= BX + BW) then
|
if (PeakRight > BX) and (PeakRight <= BX + BW) then
|
||||||
begin
|
begin
|
||||||
ACanvas.Pen.Color := CLR_PEAK_MARKER; ACanvas.Pen.Width := 2;
|
ACanvas.Pen.Color := CLR_PEAK_MARKER; ACanvas.Pen.Width := 2;
|
||||||
ACanvas.MoveTo(PeakRight, Y_BAR_TOP); ACanvas.LineTo(PeakRight, Y_BAR_BOT);
|
ACanvas.MoveTo(PeakRight, Y_BAR_TOP - (Y_BAR_BOT - Y_BAR_TOP));
|
||||||
|
ACanvas.LineTo(PeakRight, Y_BAR_BOT + (Y_BAR_BOT - Y_BAR_TOP));
|
||||||
ACanvas.Pen.Width := 1;
|
ACanvas.Pen.Width := 1;
|
||||||
end;
|
end;
|
||||||
ACanvas.Brush.Style := bsClear; ACanvas.Pen.Color := CLR_BDR;
|
// --- Вычисляем строки надписей заранее чтобы измерить ширину ---
|
||||||
ACanvas.Rectangle(BX, Y_BAR_TOP, BX + BW, Y_BAR_BOT);
|
LblDbm := Format('%.1f', [Value]);
|
||||||
|
if Value >= -73.0 then
|
||||||
|
begin
|
||||||
|
Over := Round(Value - (-73.0));
|
||||||
|
if Over < 5 then LblS := 'S9'
|
||||||
|
else begin Over := ((Over + 5) div 10) * 10; if Over = 0 then Over := 10; LblS := Format('S9+%d', [Over]); end;
|
||||||
|
end else if Value <= -121.0 then LblS := 'S1'
|
||||||
|
else begin
|
||||||
|
LblS := 'S1';
|
||||||
|
for SNum := 1 to 8 do
|
||||||
|
if Value >= (-121.0 + (SNum - 1) * 6.0) then LblS := 'S' + IntToStr(SNum);
|
||||||
|
end;
|
||||||
|
|
||||||
ACanvas.Font.Name := 'Courier New'; ACanvas.Font.Size := 6;
|
// Измеряем ширину надписей
|
||||||
ACanvas.Font.Style := []; ACanvas.Brush.Style := bsClear;
|
ACanvas.Font.Name := 'Courier New'; ACanvas.Font.Style := [fsBold];
|
||||||
|
ACanvas.Font.Size := 10; TWDbm := ACanvas.TextWidth(LblDbm); TWS := ACanvas.TextWidth(LblS);
|
||||||
|
MaxTWDbm := ACanvas.TextWidth('-120.0');
|
||||||
|
ACanvas.Font.Size := 6; ACanvas.Font.Style := []; TWUnit := ACanvas.TextWidth('dBm');
|
||||||
|
// Левый край зоны: фиксированная ширина под макс. число + "dBm " с пробелом справа
|
||||||
|
LblZoneL := BX - 4 - Max(MaxTWDbm + 2 + ACanvas.TextWidth('dBm '), TWS) - 4;
|
||||||
|
|
||||||
|
// Рамка: от левого края зоны надписей до правого края шкалы
|
||||||
|
ACanvas.Brush.Style := bsClear; ACanvas.Pen.Color := CLR_BDR;
|
||||||
|
ACanvas.Rectangle(LblZoneL, Y_BAR_TOP, BX + BW, Y_BAR_BOT);
|
||||||
|
// разделитель между зоной надписей и шкалой
|
||||||
|
ACanvas.Pen.Color := TColor($00404040);
|
||||||
|
ACanvas.MoveTo(BX, Y_BAR_TOP + 1); ACanvas.LineTo(BX, Y_BAR_BOT - 1);
|
||||||
|
|
||||||
|
// --- Шкальные тики и надписи ---
|
||||||
|
ACanvas.Font.Size := 6; ACanvas.Font.Style := []; ACanvas.Brush.Style := bsClear;
|
||||||
for i := 0 to High(DBM_MARKS) do
|
for i := 0 to High(DBM_MARKS) do
|
||||||
begin
|
begin
|
||||||
X := DBtoX(DBM_MARKS[i]);
|
X := DBtoX(DBM_MARKS[i]);
|
||||||
@@ -1023,26 +1052,18 @@ begin
|
|||||||
ACanvas.TextOut(X - TW div 2, Y_BAR_BOT + TICK_LONG + 1, Lbl);
|
ACanvas.TextOut(X - TW div 2, Y_BAR_BOT + TICK_LONG + 1, Lbl);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
ACanvas.Font.Size := 8; ACanvas.Font.Style := [fsBold]; ACanvas.Font.Color := CLR_LABEL_DBM;
|
// --- Надписи в левой зоне, левовыровнены к LblZoneL+4 ---
|
||||||
Lbl := Format('%6.1f', [Value]);
|
ACanvas.Brush.Style := bsClear;
|
||||||
ACanvas.TextOut(R.Left + 1, R.Top + 1, Lbl);
|
ACanvas.Font.Size := 10; ACanvas.Font.Style := [fsBold]; TH10 := ACanvas.TextHeight('0');
|
||||||
ACanvas.Font.Size := 6; ACanvas.Font.Style := [];
|
ACanvas.Font.Size := 6; ACanvas.Font.Style := []; TH6 := ACanvas.TextHeight('0');
|
||||||
ACanvas.Font.Color := TColor($00507070);
|
// "-85.3" над "dBm", снизу прижаты к верхнему краю полосы
|
||||||
ACanvas.TextOut(R.Left + 1, Y_BAR_TOP - ACanvas.TextHeight('dBm') - 1, 'dBm');
|
ACanvas.Font.Size := 10; ACanvas.Font.Style := [fsBold]; ACanvas.Font.Color := CLR_LABEL_DBM;
|
||||||
|
ACanvas.TextOut(LblZoneL + 4, Y_BAR_TOP - TH10 - 2, LblDbm);
|
||||||
ACanvas.Font.Size := 8; ACanvas.Font.Style := [fsBold]; ACanvas.Font.Color := CLR_LABEL_S;
|
ACanvas.Font.Size := 6; ACanvas.Font.Style := []; ACanvas.Font.Color := TColor($00507070);
|
||||||
if Value >= -73.0 then
|
ACanvas.TextOut(LblZoneL + 4 + TWDbm + 2, Y_BAR_TOP - TH6 - 4, 'dBm');
|
||||||
begin
|
// S-значение под полосой, левый край у LblZoneL+4
|
||||||
Over := Round(Value - (-73.0));
|
ACanvas.Font.Size := 10; ACanvas.Font.Style := [fsBold]; ACanvas.Font.Color := CLR_LABEL_S;
|
||||||
if Over < 5 then Lbl := 'S9'
|
ACanvas.TextOut(LblZoneL + 4, Y_BAR_BOT + 2, LblS);
|
||||||
else begin Over := ((Over + 5) div 10) * 10; if Over = 0 then Over := 10; Lbl := Format('S9+%d', [Over]); end;
|
|
||||||
end else if Value <= -121.0 then Lbl := 'S1'
|
|
||||||
else begin
|
|
||||||
Lbl := 'S1';
|
|
||||||
for SNum := 1 to 8 do
|
|
||||||
if Value >= (-121.0 + (SNum - 1) * 6.0) then Lbl := 'S' + IntToStr(SNum);
|
|
||||||
end;
|
|
||||||
ACanvas.TextOut(R.Left + 1, Y_BAR_BOT + TICK_LONG + 1, Lbl);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TSpectrumView.DrawSMeterZone(ACanvas: TCanvas; R: TRect;
|
procedure TSpectrumView.DrawSMeterZone(ACanvas: TCanvas; R: TRect;
|
||||||
|
|||||||
Reference in New Issue
Block a user