| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- // SPDX-License-Identifier: LGPL-3.0-linking-exception
- unit BCGradientButton;
- {$mode delphi}
- interface
- uses
- Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
- BGRABitmap, BGRABitmapTypes, BCTypes;
- type
- { TBCGradientButton }
- TBCGradientButton = class(TGraphicControl)
- private
- FBorderColor: TBCPixel;
- FBorderSize: integer;
- FColor1: TBCPixel;
- FColor2: TBCPixel;
- FDimColor: TBCPixel;
- FLockHorizontal: boolean;
- FLockVertical: boolean;
- FOnAfterRedraw: TBGRARedrawEvent;
- FOnBeforeRedraw: TBGRARedrawEvent;
- Fx: integer;
- Fy: integer;
- Fdraw: boolean;
- Fupdating: boolean;
- Fdown: boolean;
- procedure ColorInvalidate({%H-}ASender: TObject; {%H-}AData: PtrInt);
- procedure SetBorderColor(AValue: TBCPixel);
- procedure SetBorderSize(AValue: integer);
- procedure SetColor1(AValue: TBCPixel);
- procedure SetColor2(AValue: TBCPixel);
- procedure SetDimColor(AValue: TBCPixel);
- procedure SetLockHorizontal(AValue: boolean);
- procedure SetLockVertical(AValue: boolean);
- protected
- procedure Paint; override;
- procedure MouseMove(Shift: TShiftState; X, Y: integer); override;
- procedure MouseLeave; override;
- procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: integer); override;
- procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer); override;
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- procedure Invalidate; override;
- procedure BeginUpdate;
- procedure EndUpdate;
- published
- property LockHorizontal: boolean read FLockHorizontal
- write SetLockHorizontal default False;
- property LockVertical: boolean
- read FLockVertical write SetLockVertical default False;
- property DimColor: TBCPixel read FDimColor write SetDimColor;
- property Color1: TBCPixel read FColor1 write SetColor1;
- property Color2: TBCPixel read FColor2 write SetColor2;
- property BorderColor: TBCPixel read FBorderColor write SetBorderColor;
- property BorderSize: integer read FBorderSize write SetBorderSize;
- property OnBeforeRedraw: TBGRARedrawEvent read FOnBeforeRedraw write FOnBeforeRedraw;
- property OnAfterRedraw: TBGRARedrawEvent read FOnAfterRedraw write FOnAfterRedraw;
- published
- property Align;
- property Anchors;
- property BorderSpacing;
- property Caption;
- property Enabled;
- property ShowHint;
- end;
- procedure Register;
- implementation
- procedure Register;
- begin
- RegisterComponents('BGRA Button Controls', [TBCGradientButton]);
- end;
- { TBCGradientButton }
- procedure TBCGradientButton.SetLockHorizontal(AValue: boolean);
- begin
- if FLockHorizontal = AValue then
- Exit;
- FLockHorizontal := AValue;
- Invalidate;
- end;
- procedure TBCGradientButton.SetColor1(AValue: TBCPixel);
- begin
- if FColor1 = AValue then
- Exit;
- FColor1 := AValue;
- Invalidate;
- end;
- procedure TBCGradientButton.SetBorderColor(AValue: TBCPixel);
- begin
- if FBorderColor = AValue then
- Exit;
- FBorderColor := AValue;
- Invalidate;
- end;
- procedure TBCGradientButton.ColorInvalidate(ASender: TObject; AData: PtrInt);
- begin
- Invalidate;
- end;
- procedure TBCGradientButton.SetBorderSize(AValue: integer);
- begin
- if FBorderSize = AValue then
- Exit;
- FBorderSize := AValue;
- Invalidate;
- end;
- procedure TBCGradientButton.SetColor2(AValue: TBCPixel);
- begin
- if FColor2 = AValue then
- Exit;
- FColor2 := AValue;
- Invalidate;
- end;
- procedure TBCGradientButton.SetDimColor(AValue: TBCPixel);
- begin
- if FDimColor = AValue then
- Exit;
- FDimColor := AValue;
- Invalidate;
- end;
- procedure TBCGradientButton.SetLockVertical(AValue: boolean);
- begin
- if FLockVertical = AValue then
- Exit;
- FLockVertical := AValue;
- Invalidate;
- end;
- procedure TBCGradientButton.Paint;
- var
- bmp: TBGRABitmap;
- x, y: integer;
- begin
- bmp := TBGRABitmap.Create(Width, Height);
- if Assigned(FOnBeforeRedraw) then
- FOnBeforeRedraw(Self, bmp);
- if Fdraw and Enabled then
- begin
- x := Fx;
- y := Fy;
- if FLockHorizontal then
- x := Width div 2;
- if FLockVertical then
- y := Height div 2;
- bmp.GradientFill(0, 0, Width, Height, FColor1.Pixel, FColor2.Pixel, gtRadial,
- PointF(x, y), PointF(x - Width, y), dmDrawWithTransparency);
- bmp.RectangleAntialias(0, 0, Width, Height, FBorderColor.Pixel,
- FBorderSize, BGRAPixelTransparent);
- if Fdown then
- bmp.Rectangle(0, 0, Width, Height, FDimColor.Pixel, FDimColor.Pixel,
- dmDrawWithTransparency);
- end;
- if Assigned(FOnAfterRedraw) then
- FOnAfterRedraw(Self, bmp);
- bmp.Draw(Canvas, 0, 0, False);
- bmp.Free;
- end;
- procedure TBCGradientButton.Invalidate;
- begin
- if Fupdating then
- Exit;
- inherited Invalidate;
- end;
- procedure TBCGradientButton.MouseMove(Shift: TShiftState; X, Y: integer);
- begin
- inherited MouseMove(Shift, X, Y);
- Fx := X;
- Fy := Y;
- Fdraw := True;
- Invalidate;
- end;
- procedure TBCGradientButton.MouseLeave;
- begin
- inherited MouseLeave;
- Fdraw := False;
- Fdown := False;
- Invalidate;
- end;
- procedure TBCGradientButton.MouseDown(Button: TMouseButton; Shift: TShiftState;
- X, Y: integer);
- begin
- inherited MouseDown(Button, Shift, X, Y);
- Fdown := True;
- Invalidate;
- end;
- procedure TBCGradientButton.MouseUp(Button: TMouseButton; Shift: TShiftState;
- X, Y: integer);
- begin
- inherited MouseUp(Button, Shift, X, Y);
- Fdown := False;
- Invalidate;
- end;
- constructor TBCGradientButton.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- BeginUpdate;
- FLockHorizontal := False;
- FLockVertical := False;
- FColor1 := TBCPixel.Create(Self, BGRA(255, 255, 255, 100));
- FColor1.OnChange := ColorInvalidate;
- FColor2 := TBCPixel.Create(Self, BGRA(0, 0, 0, 0));
- FColor2.OnChange := ColorInvalidate;
- FBorderColor := TBCPixel.Create(Self, BGRA(255, 255, 255, 100));
- FBorderColor.OnChange := ColorInvalidate;
- FDimColor := TBCPixel.Create(Self, BGRA(0, 0, 0, 100));
- FDimColor.OnChange := ColorInvalidate;
- FBorderSize := 2;
- Fdown := False;
- EndUpdate;
- end;
- destructor TBCGradientButton.Destroy;
- begin
- FColor1.Free;
- FColor2.Free;
- FBorderColor.Free;
- FDimColor.Free;
- inherited Destroy;
- end;
- procedure TBCGradientButton.BeginUpdate;
- begin
- Fupdating := True;
- end;
- procedure TBCGradientButton.EndUpdate;
- begin
- Fupdating := False;
- Invalidate;
- end;
- end.
|