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.
|