📄 qicompass.pas
字号:
//****************************************************************************************************************************************************
procedure TiCompass.SetPointerStyle(const Value: TiCompassPointerStyle);
begin
if FPointerStyle <> Value then
begin
FPointerStyle := Value;
InvalidateChange;
end;
end;
//****************************************************************************************************************************************************
procedure TiCompass.SetPointerSize(const Value: Integer);
begin
if FPointerSize <> Value then
begin
FPointerSize := Value;
if FPointerSize < 1 then FPointerSize := 1;
BackGroundChange;
end;
end;
//****************************************************************************************************************************************************
procedure TiCompass.iPaintTo(Canvas: TCanvas);
var
CenterPoint : TPoint;
OuterRect : TRect;
OuterRadius : Integer;
begin
CenterPoint := GetCenterPoint(Canvas);
Canvas.Font.Assign(TickLabelFont);
FKnobRadius := Width div 2 - OuterMargin - OuterBevelWidth - TickMargin - TickLength - TickLabelInnerMargin - TickLabelOuterMargin - Canvas.TextWidth('N');
if CachedDrawing then
begin
if BackGroundChanged then
begin
CreateBackGroundBitmap;
DrawBackGround(BackGroundBitmap.Canvas, BackGroundColor);
OuterRadius := (Width - 1 - 2*FOuterMargin) div 2;
DrawGradientCircle(BackGroundBitmap.Canvas, CenterPoint, OuterRadius, True);
BackGroundBitmap.Canvas.Brush.Style := bsSolid;
BackGroundBitmap.Canvas.Brush.Color := ScaleBackGroundColor;
BackGroundBitmap.Canvas.Pen.Color := ScaleBackGroundColor;
OuterRect := Rect(CenterPoint.X - OuterRadius + FOuterBevelWidth, CenterPoint.Y - OuterRadius + FOuterBevelWidth,
CenterPoint.X + OuterRadius - FOuterBevelWidth, CenterPoint.Y + OuterRadius - FOuterBevelWidth);
BackGroundBitmap.Canvas.Ellipse(OuterRect.Left, OuterRect.Top, OuterRect.Right, OuterRect.Bottom);
OuterRect := Rect(CenterPoint.X - FKnobRadius, CenterPoint.Y - FKnobRadius,
CenterPoint.X + FKnobRadius, CenterPoint.Y + FKnobRadius);
DrawGradientCircle(BackGroundBitmap.Canvas, CenterPoint, FKnobRadius, False);
DrawTicks (CenterPoint, BackGroundBitmap.Canvas);
ResetBackGroundChange;
end;
TransferBackGround (Canvas);
DrawIndicator (CenterPoint, Canvas);
DrawDirectionDisplay(Canvas);
end
else
begin
DrawBackGround(Canvas, BackGroundColor);
OuterRadius := (Width - 1 - 2*FOuterMargin) div 2;
DrawGradientCircle(Canvas, CenterPoint, OuterRadius, True);
Canvas.Brush.Style := bsSolid;
Canvas.Brush.Color := ScaleBackGroundColor;
Canvas.Pen.Color := ScaleBackGroundColor;
OuterRect := Rect(CenterPoint.X - OuterRadius + FOuterBevelWidth, CenterPoint.Y - OuterRadius + FOuterBevelWidth,
CenterPoint.X + OuterRadius - FOuterBevelWidth, CenterPoint.Y + OuterRadius - FOuterBevelWidth);
Canvas.Ellipse(OuterRect.Left, OuterRect.Top, OuterRect.Right, OuterRect.Bottom);
OuterRect := Rect(CenterPoint.X - FKnobRadius, CenterPoint.Y - FKnobRadius,
CenterPoint.X + FKnobRadius, CenterPoint.Y + FKnobRadius);
DrawGradientCircle(Canvas, CenterPoint, FKnobRadius, False);
DrawTicks (CenterPoint, Canvas);
DrawIndicator (CenterPoint, Canvas);
DrawDirectionDisplay(Canvas);
end;
end;
//****************************************************************************************************************************************************
procedure TiCompass.DrawTicks(const OffsetPoint: TPoint; Canvas: TCanvas);
var
OuterPoint : TPoint;
InnerPoint : TPoint;
MajorRadius1 : Double;
MajorRadius2 : Double;
TextRadius : Double;
TextRect1 : TRect;
TextPoint : TPoint;
TextString : String;
x : Integer;
DegreeMajor : Double;
Point1 : TPoint;
Point2 : TPoint;
Point3 : TPoint;
Point4 : TPoint;
begin
with Canvas do
begin
Brush.Style := bsClear;
MajorRadius1 := FKnobRadius + TickMargin - 1;
MajorRadius2 := FKnobRadius + TickMargin + TickLength;
Font.Assign(TickLabelFont);
for x := 0 to 7 do
begin
DegreeMajor := 360 / 8 * x + 90;
//------------------------------------------------------------------------------------------------------------------------------------------
Pen.Color := TickColor;
Brush.Color := TickColor;
Brush.Style := bsSolid;
OuterPoint := GetXYRadPoint(DegreeMajor, MajorRadius1, OffsetPoint);
Point1 := GetXYRadPoint(DegreeMajor -90, FTickWidth/2, OuterPoint);
Point2 := GetXYRadPoint(DegreeMajor +90, FTickWidth/2, OuterPoint);
InnerPoint := GetXYRadPoint(DegreeMajor, MajorRadius2, OffsetPoint);
Point3 := GetXYRadPoint(DegreeMajor -90, FTickWidth/2, InnerPoint);
Point4 := GetXYRadPoint(DegreeMajor +90, FTickWidth/2, InnerPoint);
Polygon([Point1, Point2, Point4, Point3]);
//------------------------------------------------------------------------------------------------------------------------------------------
case x of
0 : TextString := FNCaption;
1 : TextString := FNWCaption;
2 : TextString := FWCaption;
3 : TextString := FSWCaption;
4 : TextString := FSCaption;
5 : TextString := FSECaption;
6 : TextString := FECaption;
7 : TextString := FNECaption;
end;
if Assigned(FOnCustomizeTickLabel) then FOnCustomizeTickLabel(Self, x, TextString);
Brush.Style := bsClear;
TextRadius := MajorRadius2 + TickLabelInnerMargin + 4;
TextPoint := GetXYRadPoint(DegreeMajor, TextRadius, OffsetPoint);
TextRect1 := Rect(TextPoint.x - TextWidth (TextString) div 2,
TextPoint.y - TextHeight(TextString) div 2,
TextPoint.x + TextWidth (TextString) div 2,
TextPoint.y + TextHeight(TextString) div 2);
TextOut(TextPoint.x - TextWidth (TextString) div 2, TextPoint.y - TextHeight(TextString) div 2, TextString);
end;
//------------------------------------------------------------------------------------------------------------------------------------------
end;
end;
//****************************************************************************************************************************************************
procedure TiCompass.DrawIndicator(const OffsetPoint: TPoint; Canvas: TCanvas);
var
PointerEndPoint : TPoint;
PointerBasePoint : TPointDouble;
Point1 : TPoint;
Point2 : TPoint;
Point3 : TPoint;
Point4 : TPoint;
OuterPoint : TPoint;
InnerPoint : TPoint;
ActualAngle : Double;
OffsetPointDouble : TPointDouble;
Point1Double : TPointDouble;
Point2Double : TPointDouble;
begin
with Canvas do
begin
Brush.Style := bsSolid;
Brush.Color := FPointerColor;
Pen.Color := FPointerColor;
ActualAngle := -FDirection + 90;
case FPointerStyle of
icpsTriangle : begin
OffsetPointDouble.X := OffsetPoint.X;
OffsetPointDouble.Y := OffsetPoint.Y;
PointerEndPoint := GetXYRadPoint(ActualAngle, FKnobRadius + FPointerMargin + FPointerSize, OffsetPoint);
PointerBasePoint := GetXYRadPointDouble(ActualAngle, FKnobRadius + FPointerMargin, OffsetPointDouble);
Point1Double := GetXYRadPointDouble(ActualAngle + 90, FPointerSize/2, PointerBasePoint);
Point2Double := GetXYRadPointDouble(ActualAngle - 90, FPointerSize/2, PointerBasePoint);
Point1 := Point(Round(Point1Double.X), Round(Point1Double.Y));
Point2 := Point(Round(Point2Double.X), Round(Point2Double.Y));
Polygon([Point1, Point2, PointerEndPoint]);
end;
icpsCircle : begin
PointerEndPoint := GetXYRadPoint(ActualAngle, FKnobRadius + FPointerMargin + FPointerSize div 2, OffsetPoint);
Ellipse(PointerEndPoint.X - FPointerSize div 2, PointerEndPoint.Y - FPointerSize div 2,
PointerEndPoint.X + FPointerSize div 2, PointerEndPoint.Y + FPointerSize div 2);
end;
icpsLine : begin
OuterPoint := GetXYRadPoint(ActualAngle, FKnobRadius + FPointerMargin + FPointerSize, OffsetPoint);
Point1 := GetXYRadPoint(ActualAngle -90, FTickWidth/2, OuterPoint);
Point2 := GetXYRadPoint(ActualAngle +90, FTickWidth/2, OuterPoint);
InnerPoint := GetXYRadPoint(ActualAngle, FKnobRadius + FPointerMargin, OffsetPoint);
Point3 := GetXYRadPoint(ActualAngle -90, FTickWidth/2, InnerPoint);
Point4 := GetXYRadPoint(ActualAngle +90, FTickWidth/2, InnerPoint);
Polygon([Point1, Point2, Point4, Point3]);
end;
end;
end;
end;
//****************************************************************************************************************************************************
procedure TiCompass.DrawDirectionDisplay(Canvas: TCanvas);
var
CenterPoint : TPoint;
TextString : String;
x, y : Integer;
begin
if not FShowDirectionDisplay then Exit;
CenterPoint := GetCenterPoint(Canvas);
with Canvas do
begin
Brush.Style := bsClear;
Font.Assign(FDirectionDisplayFont);
TextString := Trim(Format('%.' + IntToStr(FDirectionDisplayPrecision) + 'f',[Direction]));
y := CenterPoint.y - TextHeight(TextString) div 2;
x := CenterPoint.x - TextWidth(TextString ) div 2;
TextOut(x, y, TextString);
end;
end;
//****************************************************************************************************************************************************
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -