⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qicompass.pas

📁 Iocomp Ultra Pack v3.0.2 Sources.For.Delphi 数据显示编程插件,可用于工业控制
💻 PAS
📖 第 1 页 / 共 2 页
字号:
//****************************************************************************************************************************************************
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 + -