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