| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334 |
- // SPDX-License-Identifier: LGPL-3.0-linking-exception
- {******************************* CONTRIBUTOR(S) ******************************
- - Edivando S. Santos Brasil | [email protected]
- (Compatibility with delphi VCL 11/2018)
- ***************************** END CONTRIBUTOR(S) *****************************}
- unit BCRadialProgressBar;
- {$I bgracontrols.inc}
- interface
- uses
- Classes, SysUtils, {$IFDEF FPC}LResources,{$ENDIF} Forms, Controls, Graphics, Dialogs, BCBaseCtrls,
- {$IFNDEF FPC}Types, BGRAGraphics, GraphType, FPImage, {$ENDIF}
- BGRABitmap, BGRABitmapTypes, BGRATextFX;
- type
- { TBCRadialProgressBar }
- TBCRadialProgressBar = class(TBCGraphicControl)
- private
- FDrawText: boolean;
- { Private declarations }
- FMaxValue: integer;
- FMinValue: integer;
- FRotation: single;
- FValue: integer;
- FBitmap: TBGRABitmap;
- FLineColor: TColor;
- FLineBkgColor: TColor;
- FFontShadowColor: TColor;
- FFontShadowOffsetX: integer;
- FFontShadowOffsetY: integer;
- FFontShadowRadius: integer;
- FLineWidth: single;
- procedure SetDrawText(AValue: boolean);
- procedure SetFFontShadowColor(AValue: TColor);
- procedure SetFFontShadowOffsetX(AValue: integer);
- procedure SetFFontShadowOffsetY(AValue: integer);
- procedure SetFFontShadowRadius(AValue: integer);
- procedure SetFLineBkgColor(AValue: TColor);
- procedure SetFLineColor(AValue: TColor);
- procedure SetMaxValue(AValue: integer);
- procedure SetMinValue(AValue: integer);
- procedure SetRotation(AValue: single);
- procedure SetValue(AValue: integer);
- procedure SetLineWidth(AValue: single);
- protected
- { Protected declarations }
- procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
- {%H-}WithThemeSpace: boolean); override;
- procedure DrawControl; override;
- procedure RenderControl; override;
- procedure SetColor(Value: TColor); override;
- public
- { Public declarations }
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- property Rotation: single read FRotation write SetRotation default 0;
- property DrawText: boolean read FDrawText write SetDrawText default true;
- published
- { Published declarations }
- property Align;
- property Anchors;
- property MinValue: integer read FMinValue write SetMinValue default 0;
- property MaxValue: integer read FMaxValue write SetMaxValue default 100;
- property Value: integer read FValue write SetValue default 0;
- property OnClick;
- property OnMouseDown;
- property OnMouseEnter;
- property OnMouseLeave;
- property OnMouseMove;
- property OnMouseUp;
- property OnMouseWheel;
- property OnMouseWheelUp;
- property OnMouseWheelDown;
- property Color default clWhite;
- property LineColor: TColor read FLineColor write SetFLineColor default clBlack;
- property LineBkgColor: TColor read FLineBkgColor write SetFLineBkgColor default
- clSilver;
- property LineWidth: single read FLineWidth write SetLineWidth {$IFDEF FPC}default 4{$ENDIF};
- property FontShadowColor: TColor read FFontShadowColor
- write SetFFontShadowColor default clBlack;
- property FontShadowOffsetX: integer read FFontShadowOffsetX
- write SetFFontShadowOffsetX default 2;
- property FontShadowOffsetY: integer read FFontShadowOffsetY
- write SetFFontShadowOffsetY default 2;
- property FontShadowRadius: integer read FFontSHadowRadius
- write SetFFontShadowRadius default 4;
- property Font;
- end;
- {$IFDEF FPC}procedure Register;{$ENDIF}
- implementation
- {$IFDEF FPC}
- procedure Register;
- begin
- {$IFDEF FPC}
- {$I icons\bcradialprogressbar_icon.lrs}
- {$ENDIF}
- RegisterComponents('BGRA Controls', [TBCRadialProgressBar]);
- end;
- {$ENDIF}
- { TBCRadialProgressBar }
- procedure TBCRadialProgressBar.SetMaxValue(AValue: integer);
- begin
- if FMaxValue = AValue then
- exit;
- FMaxValue := AValue;
- if FValue > FMaxValue then
- FValue := FMaxValue;
- if FMinValue > FMaxValue then
- FMinValue := FMaxValue;
- RenderControl;
- Invalidate;
- end;
- procedure TBCRadialProgressBar.SetFLineBkgColor(AValue: TColor);
- begin
- if FLineBkgColor = AValue then
- Exit;
- FLineBkgColor := AValue;
- RenderControl;
- Invalidate;
- end;
- procedure TBCRadialProgressBar.SetFFontShadowColor(AValue: TColor);
- begin
- if FFontShadowColor = AValue then
- Exit;
- FFontShadowColor := AValue;
- RenderControl;
- Invalidate;
- end;
- procedure TBCRadialProgressBar.SetDrawText(AValue: boolean);
- begin
- if FDrawText=AValue then Exit;
- FDrawText:=AValue;
- RenderControl;
- Invalidate;
- end;
- procedure TBCRadialProgressBar.SetFFontShadowOffsetX(AValue: integer);
- begin
- if FFontShadowOffsetX = AValue then
- Exit;
- FFontShadowOffsetX := AValue;
- RenderControl;
- Invalidate;
- end;
- procedure TBCRadialProgressBar.SetFFontShadowOffsetY(AValue: integer);
- begin
- if FFontShadowOffsetY = AValue then
- Exit;
- FFontShadowOffsetY := AValue;
- RenderControl;
- Invalidate;
- end;
- procedure TBCRadialProgressBar.SetFFontShadowRadius(AValue: integer);
- begin
- if FFontSHadowRadius = AValue then
- Exit;
- FFontSHadowRadius := AValue;
- RenderControl;
- Invalidate;
- end;
- procedure TBCRadialProgressBar.SetFLineColor(AValue: TColor);
- begin
- if FLineColor = AValue then
- Exit;
- FLineColor := AValue;
- RenderControl;
- Invalidate;
- end;
- procedure TBCRadialProgressBar.SetMinValue(AValue: integer);
- begin
- if FMinValue = AValue then
- exit;
- FMinValue := AValue;
- if FValue < FMinValue then
- FValue := FMinValue;
- if FMaxValue < FMinValue then
- FMaxValue := FMinValue;
- RenderControl;
- Invalidate;
- end;
- procedure TBCRadialProgressBar.SetRotation(AValue: single);
- begin
- if FRotation=AValue then Exit;
- FRotation:=AValue;
- RenderControl;
- Invalidate;
- end;
- procedure TBCRadialProgressBar.SetValue(AValue: integer);
- begin
- if FValue = AValue then
- exit;
- FValue := AValue;
- if FValue < FMinValue then
- FValue := FMinValue;
- if FValue > FMaxValue then
- FValue := FMaxValue;
- RenderControl;
- Invalidate;
- end;
- procedure TBCRadialProgressBar.SetLineWidth(AValue: single);
- begin
- if (FLineWidth = AValue) then
- exit;
- FLineWidth := AValue;
- RenderControl;
- Invalidate;
- end;
- procedure TBCRadialProgressBar.CalculatePreferredSize(
- var PreferredWidth, PreferredHeight: integer; WithThemeSpace: boolean);
- begin
- PreferredWidth := 200;
- PreferredHeight := 200;
- end;
- procedure TBCRadialProgressBar.DrawControl;
- begin
- {$IFNDEF FPC}//# //@ IN DELPHI RenderControl NEDD. IF NO RenderControl BE BLACK AFTER INVALIDATE.
- RenderControl;
- {$ENDIF}
- FBitmap.Draw(Canvas, 0, 0, False);
- end;
- procedure TBCRadialProgressBar.RenderControl;
- var
- textBmp: TBGRABitmap;
- textStr: string;
- EffectiveLineWidth:single;
- begin
- FreeAndNil(FBitmap);
- FBitmap := TBGRABitmap.Create(Width, Height);
- FBitmap.Canvas2D.resetTransform;
- FBitmap.Canvas2D.translate(FBitmap.Width/2, FBitmap.Height/2);
- FBitmap.Canvas2D.rotate(FRotation*Pi/180);
- FBitmap.Canvas2D.beginPath;
- FBitmap.Canvas2D.arc(0, 0, Height / 2.5, 0, pi * 2, False);
- FBitmap.Canvas2D.fillStyle(Color);
- FBitmap.Canvas2D.fill;
- if LineWidth=0 then
- EffectiveLineWidth:=Height / 50
- else
- EffectiveLineWidth:=LineWidth;
- FBitmap.Canvas2D.lineWidth := EffectiveLineWidth;
- FBitmap.Canvas2D.strokeStyle(LineBkgColor);
- FBitmap.Canvas2D.stroke;
- FBitmap.Canvas2D.beginPath;
- if Value <> MinValue then
- FBitmap.Canvas2D.arc(0, 0, Height / 2.5, pi * 1.5,
- (pi * 1.5) + ((pi * 2) * Value / MaxValue), False);
- FBitmap.Canvas2D.fillStyle(BGRAPixelTransparent);
- FBitmap.Canvas2D.fill;
- FBitmap.Canvas2D.lineWidth := EffectiveLineWidth;
- FBitmap.Canvas2D.strokeStyle(LineColor);
- FBitmap.Canvas2D.stroke;
- if MaxValue = 0 then
- textStr := '0%'
- else
- textStr := FloatToStr(Round((Value / MaxValue) * 100)) + '%';
- if DrawText then
- begin
- textBmp := TextShadow(Width, Height, textStr, Font.Height,
- Font.Color, FontShadowColor, FontShadowOFfsetX,
- FontShadowOffsetY, FontSHadowRadius, Font.Style, Font.Name) as TBGRABitmap;
- FBitmap.PutImage(0, 0, textBmp, dmDrawWithTransparency);
- textBmp.Free;
- end;
- end;
- procedure TBCRadialProgressBar.SetColor(Value: TColor);
- begin
- inherited SetColor(Value);
- RenderControl;
- Invalidate;
- end;
- constructor TBCRadialProgressBar.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- with GetControlClassDefaultSize do
- SetInitialBounds(0, 0, 200, 200);
- FMaxValue := 100;
- FMinValue := 0;
- FValue := 0;
- FLineColor := clBlack;
- FLineBkgColor := clSilver;
- FLineWidth:=0;
- FFontShadowColor := clBlack;
- FFontShadowOffsetX := 2;
- FFontShadowOffsetY := 2;
- FFontShadowRadius := 4;
- Font.Color := clBlack;
- Font.Height := 20;
- Color := clWhite;
- FRotation := 0;
- FDrawText := True;
- end;
- destructor TBCRadialProgressBar.Destroy;
- begin
- FreeAndNil(FBitmap);
- inherited Destroy;
- end;
- end.
|