| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- // SPDX-License-Identifier: LGPL-3.0-linking-exception
- {
- Created by BGRA Controls Team
- Dibo, Circular, lainz (007) and contributors.
- For detailed information see readme.txt
- Site: https://sourceforge.net/p/bgra-controls/
- Wiki: http://wiki.lazarus.freepascal.org/BGRAControls
- Forum: http://forum.lazarus.freepascal.org/index.php/board,46.0.html
- }
- {******************************* CONTRIBUTOR(S) ******************************
- - Edivando S. Santos Brasil | [email protected]
- (Compatibility with delphi VCL 11/2018)
- ***************************** END CONTRIBUTOR(S) *****************************}
- unit BGRAGraphicControl;
- {$I bgracontrols.inc}
- interface
- uses
- Classes, SysUtils, {$IFDEF FPC}LResources,{$ENDIF} Forms, Controls, Graphics, Dialogs, Types,
- {$IFNDEF FPC}BGRAGraphics, GraphType, FPImage, {$ENDIF}
- BCBaseCtrls, ExtCtrls, BGRABitmap, BCTypes;
- type
- { TCustomBGRAGraphicControl }
- TCustomBGRAGraphicControl = class(TBGRAGraphicCtrl)
- private
- { Private declarations }
- FOnRedraw: TBGRARedrawEvent;
- FBevelInner, FBevelOuter: TPanelBevel;
- FBevelWidth: TBevelWidth;
- FBorderWidth: TBorderWidth;
- FAlignment: TAlignment;
- FColorOpacity: byte;
- function GetBitmapHeight: integer;
- function GetBitmapScale: double;
- function GetBitmapWidth: integer;
- procedure SetAlignment(const Value: TAlignment);
- procedure SetBevelInner(const AValue: TPanelBevel);
- procedure SetBevelOuter(const AValue: TPanelBevel);
- procedure SetBevelWidth(const AValue: TBevelWidth);
- procedure SetBitmapAutoScale(AValue: boolean);
- procedure SetBorderWidth(const AValue: TBorderWidth);
- procedure SetColorOpacity(const AValue: byte);
- protected
- { Protected declarations }
- FBGRA: TBGRABitmap;
- FBitmapAutoScale: boolean;
- procedure Paint; override;
- procedure Resize; override;
- procedure BGRASetSize(AWidth, AHeight: integer); virtual;
- procedure RedrawBitmapContent; virtual;
- procedure SetColor(Value: TColor); override;
- procedure SetEnabled(Value: boolean); override;
- procedure TextChanged; override;
- property BitmapAutoScale: boolean read FBitmapAutoScale write SetBitmapAutoScale default true;
- property BitmapScale: double read GetBitmapScale;
- property BitmapWidth: integer read GetBitmapWidth;
- property BitmapHeight: integer read GetBitmapHeight;
- public
- { Public declarations }
- constructor Create(TheOwner: TComponent); override;
- procedure RedrawBitmap;
- procedure DiscardBitmap;
- destructor Destroy; override;
- property OnRedraw: TBGRARedrawEvent Read FOnRedraw Write FOnRedraw;
- property Bitmap: TBGRABitmap Read FBGRA;
- property BorderWidth: TBorderWidth Read FBorderWidth Write SetBorderWidth default 0;
- property BevelInner: TPanelBevel Read FBevelInner Write SetBevelInner default bvNone;
- property BevelOuter: TPanelBevel
- Read FBevelOuter Write SetBevelOuter default bvRaised;
- property BevelWidth: TBevelWidth Read FBevelWidth Write SetBevelWidth default 1;
- property ColorOpacity: byte Read FColorOpacity Write SetColorOpacity;
- property Alignment: TAlignment Read FAlignment Write SetAlignment;
- end;
- TBGRAGraphicControl = class(TCustomBGRAGraphicControl)
- published
- { Published declarations }
- property Align;
- property Anchors;
- property OnRedraw;
- property Bitmap;
- property BitmapAutoscale;
- property BitmapScale;
- property BorderWidth;
- property BevelInner;
- property BevelOuter;
- property BevelWidth;
- property Color;
- property ColorOpacity;
- property Alignment;
- property OnClick;
- property OnDblClick;
- property OnMouseDown;
- property OnMouseEnter;
- property OnMouseLeave;
- property OnMouseMove;
- property OnMouseUp;
- {$IFDEF FPC}
- property OnPaint;
- {$ENDIF}
- property Caption;
- end;
- {$IFDEF FPC}procedure Register;{$ENDIF}
- implementation
- uses BGRABitmapTypes, LazVersion;
- {$IFDEF FPC}
- procedure Register;
- begin
- RegisterComponents('BGRA Controls', [TBGRAGraphicControl]);
- end;
- {$ENDIF}
- procedure TCustomBGRAGraphicControl.SetAlignment(const Value: TAlignment);
- begin
- if FAlignment = Value then
- exit;
- FAlignment := Value;
- DiscardBitmap;
- end;
- function TCustomBGRAGraphicControl.GetBitmapHeight: integer;
- begin
- result := round(ClientHeight * BitmapScale);
- end;
- function TCustomBGRAGraphicControl.GetBitmapScale: double;
- begin
- {$if laz_fullversion >= 2000000}
- if not FBitmapAutoScale then
- result := GetCanvasScaleFactor
- else
- result := 1;
- {$else}
- result := 1;
- {$endif}
- end;
- function TCustomBGRAGraphicControl.GetBitmapWidth: integer;
- begin
- result := round(ClientWidth * BitmapScale);
- end;
- procedure TCustomBGRAGraphicControl.SetBevelInner(const AValue: TPanelBevel);
- begin
- if FBevelInner = AValue then
- exit;
- FBevelInner := AValue;
- DiscardBitmap;
- end;
- procedure TCustomBGRAGraphicControl.SetBevelOuter(const AValue: TPanelBevel);
- begin
- if FBevelOuter = AValue then
- exit;
- FBevelOuter := AValue;
- DiscardBitmap;
- end;
- procedure TCustomBGRAGraphicControl.SetBevelWidth(const AValue: TBevelWidth);
- begin
- if FBevelWidth = AValue then
- exit;
- FBevelWidth := AValue;
- DiscardBitmap;
- end;
- procedure TCustomBGRAGraphicControl.SetBitmapAutoScale(AValue: boolean);
- begin
- if FBitmapAutoScale=AValue then Exit;
- FBitmapAutoScale:=AValue;
- DiscardBitmap;
- end;
- procedure TCustomBGRAGraphicControl.SetBorderWidth(const AValue: TBorderWidth);
- begin
- if FBorderWidth = AValue then
- exit;
- FBorderWidth := AValue;
- DiscardBitmap;
- end;
- procedure TCustomBGRAGraphicControl.SetColorOpacity(const AValue: byte);
- begin
- if FColorOpacity = AValue then
- exit;
- FColorOpacity := AValue;
- DiscardBitmap;
- end;
- procedure TCustomBGRAGraphicControl.Paint;
- begin
- BGRASetSize(BitmapWidth, BitmapHeight);
- inherited Paint;
- FBGRA.Draw(Canvas, rect(0, 0, ClientWidth, ClientHeight), False);
- end;
- procedure TCustomBGRAGraphicControl.Resize;
- begin
- inherited Resize;
- DiscardBitmap;
- end;
- procedure TCustomBGRAGraphicControl.BGRASetSize(AWidth, AHeight: integer);
- begin
- if (FBGRA <> nil) and (AWidth <> FBGRA.Width) and (AHeight <> FBGRA.Height) then
- begin
- FBGRA.SetSize(AWidth, AHeight);
- RedrawBitmapContent;
- end;
- end;
- procedure TCustomBGRAGraphicControl.RedrawBitmapContent;
- var
- ARect: TRect;
- TS: TTextStyle;
- scale: Double;
- begin
- if (FBGRA <> nil) and (FBGRA.NbPixels <> 0) then
- begin
- FBGRA.Fill(ColorToBGRA(ColorToRGB(Color), FColorOpacity));
- scale := BitmapScale;
- ARect := GetClientRect;
- ARect.Left := round(ARect.Left*scale);
- ARect.Top := round(ARect.Top*scale);
- ARect.Right := round(ARect.Right*scale);
- ARect.Bottom := round(ARect.Bottom*scale);
- // if BevelOuter is set then draw a frame with BevelWidth
- if (BevelOuter <> bvNone) and (BevelWidth > 0) then
- FBGRA.CanvasBGRA.Frame3d(ARect, round(BevelWidth*scale), BevelOuter,
- BGRA(255, 255, 255, 200), BGRA(0, 0, 0, 160)); // Note: Frame3D inflates ARect
- InflateRect(ARect, -round(BorderWidth*scale), -round(BorderWidth*scale));
- // if BevelInner is set then skip the BorderWidth and draw a frame with BevelWidth
- if (BevelInner <> bvNone) and (BevelWidth > 0) then
- FBGRA.CanvasBGRA.Frame3d(ARect, round(BevelWidth*scale), BevelInner,
- BGRA(255, 255, 255, 160), BGRA(0, 0, 0, 160)); // Note: Frame3D inflates ARect
- if Caption <> '' then
- begin
- FBGRA.CanvasBGRA.Font.Assign(Canvas.Font);
- FBGRA.CanvasBGRA.Font.Height:= round(FBGRA.CanvasBGRA.Font.Height*scale);
- {$IFDEF FPC}//#
- TS := Canvas.TextStyle;
- {$ENDIF}
- TS.Alignment := Alignment;
- TS.Layout := tlCenter;
- TS.Opaque := False;
- TS.Clipping := False;
- {$IFDEF FPC}//#
- TS.SystemFont := Canvas.Font.IsDefault;
- {$ENDIF}
- FBGRA.CanvasBGRA.Font.Color := Color xor $FFFFFF;
- FBGRA.CanvasBGRA.Font.Opacity := 255;
- if not Enabled then
- FBGRA.CanvasBGRA.Font.Style := [fsStrikeOut]
- else
- FBGRA.CanvasBGRA.Font.Style := [];
- FBGRA.CanvasBGRA.TextRect(ARect, ARect.Left, ARect.Top, Caption, TS);
- end;
- if Assigned(FOnRedraw) then
- FOnRedraw(self, FBGRA);
- end;
- end;
- procedure TCustomBGRAGraphicControl.SetColor(Value: TColor);
- begin
- if Value <> Color then
- DiscardBitmap;
- inherited SetColor(Value);
- end;
- procedure TCustomBGRAGraphicControl.SetEnabled(Value: boolean);
- begin
- if Value <> Enabled then
- DiscardBitmap;
- inherited SetEnabled(Value);
- end;
- procedure TCustomBGRAGraphicControl.TextChanged;
- begin
- DiscardBitmap;
- end;
- constructor TCustomBGRAGraphicControl.Create(TheOwner: TComponent);
- begin
- inherited Create(TheOwner);
- with GetControlClassDefaultSize do
- SetInitialBounds(0, 0, CX, CY);
- FBGRA := TBGRABitmap.Create;
- FBitmapAutoScale:= true;
- FBevelWidth := 1;
- FAlignment := taCenter;
- Color := clWhite;
- FColorOpacity := 128;
- FBevelOuter := bvRaised;
- FBevelInner := bvNone;
- end;
- procedure TCustomBGRAGraphicControl.RedrawBitmap;
- begin
- RedrawBitmapContent;
- Repaint;
- end;
- procedure TCustomBGRAGraphicControl.DiscardBitmap;
- begin
- if (FBGRA <> nil) and (FBGRA.NbPixels <> 0) then
- begin
- FBGRA.SetSize(0, 0);
- Invalidate;
- end;
- end;
- destructor TCustomBGRAGraphicControl.Destroy;
- begin
- FBGRA.Free;
- inherited Destroy;
- end;
- end.
|