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.