184 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| // 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 | mailedivando@gmail.com
 | |
|   (Compatibility with delphi VCL 11/2018)
 | |
| 
 | |
| ***************************** END CONTRIBUTOR(S) *****************************}
 | |
| unit BCToolBar;
 | |
| 
 | |
| {$I bgracontrols.inc}
 | |
| 
 | |
| interface
 | |
| 
 | |
| uses
 | |
|   Classes, {$IFDEF FPC}LResources,{$ELSE}types, BGRAGraphics, GraphType, FPImage,{$ENDIF}
 | |
|   Forms, Controls, Graphics, Dialogs, ComCtrls,
 | |
|   BGRABitmap, BGRABitmapTypes, BGRAGradients, BCTypes;
 | |
| 
 | |
| type
 | |
| 
 | |
|   { TBCToolBar }
 | |
| 
 | |
|   TBCToolBar = class(TToolBar)
 | |
|   private
 | |
|     FLimitMemoryUsage: boolean;
 | |
|     { Private declarations }
 | |
|     FOnRedraw: TBGRARedrawEvent;
 | |
|     FBGRA: TBGRABitmap;
 | |
|     procedure SetLimitMemoryUsage(AValue: boolean);
 | |
|   protected
 | |
|     { Protected declarations }
 | |
|    {$IFDEF FPC}
 | |
|    procedure Paint; override;
 | |
|    {$ELSE}
 | |
|    procedure Paint; virtual;
 | |
|    procedure PaintWindow(DC: HDC); override;
 | |
|    {$ENDIF}
 | |
|     procedure CheckMemoryUsage; virtual;
 | |
|   public
 | |
|     { Public declarations }
 | |
|     constructor Create(TheOwner: TComponent); override;
 | |
|     destructor Destroy; override;
 | |
|   published
 | |
|     { Published declarations }
 | |
|     property OnRedraw: TBGRARedrawEvent read FOnRedraw write FOnRedraw;
 | |
|     property LimitMemoryUsage: boolean read FLimitMemoryUsage write SetLimitMemoryUsage;
 | |
|   end;
 | |
| 
 | |
| procedure DrawWindows7ToolBar(Bitmap: TBGRABitmap; AColor: TColor = clDefault);
 | |
| 
 | |
| {$IFDEF FPC}procedure Register;{$ENDIF}
 | |
| 
 | |
| implementation
 | |
| 
 | |
| function SetHue(AColor: TBGRAPixel; g_hue: integer): TBGRAPixel;
 | |
| var hsla: THSLAPixel;
 | |
| begin
 | |
|   if g_hue = -1 then result := AColor else
 | |
|     begin
 | |
|       hsla := BGRAToHSLA(AColor);
 | |
|       hsla.hue := g_hue;
 | |
|       result := GSBAToBGRA(hsla);
 | |
|     end;
 | |
| end;
 | |
| 
 | |
| procedure DrawWindows7ToolBar(Bitmap: TBGRABitmap; AColor: TColor = clDefault);
 | |
| var
 | |
|   c1, c2, c3, c4: TBGRAPixel;
 | |
|   ARect, ARect2: TRect;
 | |
|   g_hue: integer;
 | |
| begin
 | |
|   if AColor = clDefault then
 | |
|     g_hue := -1
 | |
|   else
 | |
|     g_hue := BGRAToGSBA(AColor).hue;
 | |
|   ARect := Rect(0, 0, Bitmap.Width, Bitmap.Height);
 | |
|   // Font: RGBToColor(30,57,91)
 | |
| 
 | |
|   Bitmap.HorizLine(ARect.Left, ARect.Top, ARect.Right-1, SetHue(BGRA(169, 191, 214), g_hue), dmSet);
 | |
|   Bitmap.HorizLine(ARect.Left, ARect.Top + 1, ARect.Right-1, SetHue(BGRA(250, 252, 253), g_hue), dmSet);
 | |
|   Bitmap.HorizLine(ARect.Left, ARect.Top + 2, ARect.Right-1, SetHue(BGRA(253, 254, 255), g_hue), dmSet);
 | |
| 
 | |
|   c1 := SetHue(BGRA(252, 254, 255), g_hue);
 | |
|   c2 := SetHue(BGRA(243, 248, 253), g_hue);
 | |
|   c3 := SetHue(BGRA(238, 243, 250), g_hue);
 | |
|   c4 := SetHue(BGRA(238, 244, 251), g_hue);
 | |
|   ARect2 := Rect(ARect.Left, ARect.Top + 3, ARect.Right, ARect.Bottom - 3);
 | |
|   DoubleGradientAlphaFill(Bitmap, ARect2, c1, c2, c3, c4, gdVertical,
 | |
|     gdVertical, gdVertical, 0.5);
 | |
| 
 | |
|   c1 := SetHue(BGRA(249, 252, 255), g_hue);
 | |
|   c2 := SetHue(BGRA(230, 240, 250), g_hue);
 | |
|   c3 := SetHue(BGRA(220, 230, 244), g_hue);
 | |
|   c4 := SetHue(BGRA(221, 233, 247), g_hue);
 | |
|   ARect2 := Rect(ARect.Left + 1, ARect.Top + 3, ARect.Right - 1, ARect.Bottom - 3);
 | |
|   DoubleGradientAlphaFill(Bitmap, ARect2, c1, c2, c3, c4, gdVertical,
 | |
|     gdVertical, gdVertical, 0.5);
 | |
| 
 | |
|   Bitmap.HorizLine(ARect.Left, ARect.Bottom - 3, ARect.Right-1, SetHue(BGRA(228, 239, 251), g_hue), dmSet);
 | |
|   Bitmap.HorizLine(ARect.Left, ARect.Bottom - 2, ARect.Right-1, SetHue(BGRA(205, 218, 234), g_hue), dmSet);
 | |
|   Bitmap.HorizLine(ARect.Left, ARect.Bottom - 1, ARect.Right-1, SetHue(BGRA(160, 175, 195), g_hue), dmSet);
 | |
| end;
 | |
| 
 | |
| {$IFDEF FPC}
 | |
| procedure Register;
 | |
| begin
 | |
|   RegisterComponents('BGRA Controls', [TBCToolBar]);
 | |
| end;
 | |
| {$ENDIF}
 | |
| 
 | |
| { TBCToolBar }
 | |
| 
 | |
| constructor TBCToolBar.Create(TheOwner: TComponent);
 | |
| begin
 | |
|   inherited Create(TheOwner);
 | |
|   FBGRA := TBGRABitmap.Create;
 | |
| end;
 | |
| 
 | |
| destructor TBCToolBar.Destroy;
 | |
| begin
 | |
|   FBGRA.Free;
 | |
|   inherited Destroy;
 | |
| end;
 | |
| 
 | |
| procedure TBCToolBar.SetLimitMemoryUsage(AValue: boolean);
 | |
| begin
 | |
|   if FLimitMemoryUsage=AValue then Exit;
 | |
|   FLimitMemoryUsage:=AValue;
 | |
|   CheckMemoryUsage;
 | |
| end;
 | |
| 
 | |
| {$IFNDEF FPC}
 | |
| procedure TBCToolBar.PaintWindow(DC: HDC);
 | |
| begin
 | |
|   Canvas.Lock;
 | |
|   try
 | |
|     Canvas.Handle := DC;
 | |
|     try
 | |
|       TControlCanvas(Canvas).UpdateTextFlags;
 | |
|       Paint;
 | |
|     finally
 | |
|       Canvas.Handle := 0;
 | |
|     end;
 | |
|   finally
 | |
|     Canvas.Unlock;
 | |
|   end;
 | |
| end;
 | |
| {$ENDIF}
 | |
| 
 | |
| procedure TBCToolBar.Paint;
 | |
| begin
 | |
|   if (FBGRA.Width <> Width) or (FBGRA.Height <> Height) then
 | |
|   begin
 | |
|     FBGRA.SetSize(Width, Height);
 | |
|     if Assigned(FOnRedraw) then
 | |
|       { Draw using event }
 | |
|       FOnRedraw(self, FBGRA)
 | |
|     else
 | |
|       { Draw this default }
 | |
|       DrawWindows7ToolBar(FBGRA, Color);
 | |
|   end;
 | |
|   FBGRA.Draw(Canvas, 0, 0);
 | |
|   CheckMemoryUsage;
 | |
| end;
 | |
| 
 | |
| procedure TBCToolBar.CheckMemoryUsage;
 | |
| begin
 | |
|   if FLimitMemoryUsage then
 | |
|   begin
 | |
|     if FBGRA.NbPixels <> 0 then
 | |
|       FBGRA.SetSize(0,0);
 | |
|   end;
 | |
| end;
 | |
| 
 | |
| end.
 |