mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 19:19:19 +02:00
Minor edit fixes and fixes memory leaks in customdrawn
git-svn-id: trunk@33176 -
This commit is contained in:
parent
5c8ad97065
commit
4c6c91f237
@ -27,8 +27,8 @@ type
|
||||
|
||||
TCDEditDrawerWinCE = class(TCDEditDrawer)
|
||||
public
|
||||
procedure DrawToIntfImage(ADest: TFPImageCanvas; CDEdit: TCDEdit); override;
|
||||
procedure DrawToCanvas(ADest: TCanvas; CDEdit: TCDEdit); override;
|
||||
procedure DrawToIntfImage(ADest: TFPImageCanvas; CDControl: TCDControl); override;
|
||||
procedure DrawToCanvas(ADest: TCanvas; CDControl: TCDControl); override;
|
||||
end;
|
||||
|
||||
{ TCDCheckBoxDrawerWinCE }
|
||||
@ -103,12 +103,12 @@ end;
|
||||
{ TCDEditDrawerWinCE }
|
||||
|
||||
procedure TCDEditDrawerWinCE.DrawToIntfImage(ADest: TFPImageCanvas;
|
||||
CDEdit: TCDEdit);
|
||||
CDControl: TCDControl);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
procedure TCDEditDrawerWinCE.DrawToCanvas(ADest: TCanvas; CDEdit: TCDEdit);
|
||||
procedure TCDEditDrawerWinCE.DrawToCanvas(ADest: TCanvas; CDControl: TCDControl);
|
||||
begin
|
||||
|
||||
end;
|
||||
|
@ -26,11 +26,14 @@ uses
|
||||
//
|
||||
customdrawnutils;
|
||||
|
||||
const
|
||||
CDDRAWSTYLE_COUNT = 12;
|
||||
|
||||
type
|
||||
|
||||
TCDDrawStyle = (
|
||||
// The default is given by the DefaultStyle global variable
|
||||
dsDefault,
|
||||
dsDefault = 0,
|
||||
// Operating system styles
|
||||
dsWinCE, dsWin2000, dsWinXP,
|
||||
dsKDE, dsGNOME, dsMacOSX,
|
||||
@ -44,8 +47,6 @@ type
|
||||
{ TCDControl }
|
||||
|
||||
TCDControl = class(TCustomControl)
|
||||
private
|
||||
FIsMouseOver: Boolean;
|
||||
protected
|
||||
FDrawStyle: TCDDrawStyle;
|
||||
FCurrentDrawer: TCDControlDrawer;
|
||||
@ -54,23 +55,26 @@ type
|
||||
procedure PrepareCurrentDrawer(); virtual;
|
||||
procedure SetDrawStyle(const AValue: TCDDrawStyle); virtual;
|
||||
function GetClientRect: TRect; override;
|
||||
procedure EraseBackground(DC: HDC); override;
|
||||
// mouse
|
||||
procedure MouseEnter; override;
|
||||
procedure MouseLeave; override;
|
||||
//
|
||||
property DrawStyle: TCDDrawStyle read FDrawStyle write SetDrawStyle;
|
||||
public
|
||||
property IsMouseOver: Boolean read FIsMouseOver write FIsMouseOver;
|
||||
// state information
|
||||
IsMouseOver: Boolean;
|
||||
//
|
||||
procedure EraseBackground(DC: HDC); override;
|
||||
procedure Paint; override;
|
||||
end;
|
||||
TCDControlClass = class of TCDControl;
|
||||
|
||||
TCDControlDrawer = class
|
||||
public
|
||||
function GetClientRect(AControl: TCDControl): TRect; virtual; abstract;
|
||||
//procedure DrawToIntfImage(ADest: TFPImageCanvas; AControl: TCDControl);
|
||||
// virtual; abstract;
|
||||
//procedure DrawToCanvas(ADest: TCanvas; AControl: TCDControl); virtual; abstract;
|
||||
procedure DrawToIntfImage(ADest: TFPImageCanvas; AControl: TCDControl);
|
||||
virtual; abstract;
|
||||
procedure DrawToCanvas(ADest: TCanvas; AControl: TCDControl); virtual; abstract;
|
||||
end;
|
||||
|
||||
// ===================================
|
||||
@ -187,7 +191,6 @@ type
|
||||
public
|
||||
constructor Create(AOwner: TComponent); override;
|
||||
destructor Destroy; override;
|
||||
procedure EraseBackground(DC: HDC); override;
|
||||
procedure Paint; override;
|
||||
published
|
||||
property Color;
|
||||
@ -196,8 +199,6 @@ type
|
||||
|
||||
TCDEditDrawer = class(TCDControlDrawer)
|
||||
public
|
||||
procedure DrawToIntfImage(ADest: TFPImageCanvas; CDEdit: TCDEdit); virtual; abstract;
|
||||
procedure DrawToCanvas(ADest: TCanvas; CDEdit: TCDEdit); virtual; abstract;
|
||||
end;
|
||||
|
||||
{@@
|
||||
@ -722,14 +723,35 @@ begin
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
procedure TCDEdit.EraseBackground(DC: HDC);
|
||||
begin
|
||||
inherited EraseBackground(DC);
|
||||
end;
|
||||
|
||||
procedure TCDEdit.Paint;
|
||||
var
|
||||
AImage: TLazIntfImage = nil;
|
||||
ABmp: TBitmap = nil;
|
||||
lCanvas: TFPImageCanvas = nil;
|
||||
begin
|
||||
inherited Paint;
|
||||
|
||||
PrepareCurrentDrawer();
|
||||
|
||||
ABmp := TBitmap.Create;
|
||||
try
|
||||
ABmp.Width := Width;
|
||||
ABmp.Height := Height;
|
||||
AImage := ABmp.CreateIntfImage;
|
||||
lCanvas := TFPImageCanvas.Create(AImage);
|
||||
// First step of the drawing: FCL TFPCustomCanvas for fast pixel access
|
||||
TCDEditDrawer(FCurrentDrawer).DrawToIntfImage(lCanvas, Self);
|
||||
ABmp.LoadFromIntfImage(AImage);
|
||||
// Second step of the drawing: LCL TCustomCanvas for easy font access
|
||||
TCDEditDrawer(FCurrentDrawer).DrawToCanvas(ABmp.Canvas, Self);
|
||||
Canvas.Draw(0, 0, ABmp);
|
||||
finally
|
||||
if lCanvas <> nil then
|
||||
lCanvas.Free;
|
||||
if AImage <> nil then
|
||||
AImage.Free;
|
||||
ABmp.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ TCDCheckBox }
|
||||
@ -992,15 +1014,46 @@ begin
|
||||
|
||||
end;
|
||||
|
||||
procedure TCDControl.Paint;
|
||||
var
|
||||
AImage: TLazIntfImage = nil;
|
||||
ABmp: TBitmap = nil;
|
||||
lCanvas: TFPImageCanvas = nil;
|
||||
begin
|
||||
inherited Paint;
|
||||
|
||||
PrepareCurrentDrawer();
|
||||
|
||||
ABmp := TBitmap.Create;
|
||||
try
|
||||
ABmp.Width := Width;
|
||||
ABmp.Height := Height;
|
||||
AImage := ABmp.CreateIntfImage;
|
||||
lCanvas := TFPImageCanvas.Create(AImage);
|
||||
// First step of the drawing: FCL TFPCustomCanvas for fast pixel access
|
||||
FCurrentDrawer.DrawToIntfImage(lCanvas, Self);
|
||||
ABmp.LoadFromIntfImage(AImage);
|
||||
// Second step of the drawing: LCL TCustomCanvas for easy font access
|
||||
FCurrentDrawer.DrawToCanvas(ABmp.Canvas, Self);
|
||||
Canvas.Draw(0, 0, ABmp);
|
||||
finally
|
||||
if lCanvas <> nil then
|
||||
lCanvas.Free;
|
||||
if AImage <> nil then
|
||||
AImage.Free;
|
||||
ABmp.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TCDControl.MouseEnter;
|
||||
begin
|
||||
FIsMouseOver := True;
|
||||
IsMouseOver := True;
|
||||
inherited MouseEnter;
|
||||
end;
|
||||
|
||||
procedure TCDControl.MouseLeave;
|
||||
begin
|
||||
FIsMouseOver := True;
|
||||
IsMouseOver := True;
|
||||
inherited MouseLeave;
|
||||
end;
|
||||
|
||||
@ -1672,5 +1725,46 @@ begin
|
||||
Result := FTabIndex;
|
||||
end;
|
||||
|
||||
var
|
||||
i: Integer;
|
||||
finalization
|
||||
// Free all drawers
|
||||
// Standard Tab
|
||||
for i := 0 to CDDRAWSTYLE_COUNT-1 do
|
||||
begin
|
||||
RegisteredButtonDrawers[TCDDrawStyle(i)].Free;
|
||||
RegisteredButtonDrawers[TCDDrawStyle(i)] := nil;
|
||||
end;
|
||||
for i := 0 to CDDRAWSTYLE_COUNT-1 do
|
||||
begin
|
||||
RegisteredEditDrawers[TCDDrawStyle(i)].Free;
|
||||
RegisteredEditDrawers[TCDDrawStyle(i)] := nil;
|
||||
end;
|
||||
for i := 0 to CDDRAWSTYLE_COUNT-1 do
|
||||
begin
|
||||
RegisteredGroupBoxDrawers[TCDDrawStyle(i)].Free;
|
||||
RegisteredGroupBoxDrawers[TCDDrawStyle(i)] := nil;
|
||||
end;
|
||||
for i := 0 to CDDRAWSTYLE_COUNT-1 do
|
||||
begin
|
||||
RegisteredCheckBoxDrawers[TCDDrawStyle(i)].Free;
|
||||
RegisteredCheckBoxDrawers[TCDDrawStyle(i)] := nil;
|
||||
end;
|
||||
// Common Controls Tab
|
||||
for i := 0 to CDDRAWSTYLE_COUNT-1 do
|
||||
begin
|
||||
RegisteredTrackBarDrawers[TCDDrawStyle(i)].Free;
|
||||
RegisteredTrackBarDrawers[TCDDrawStyle(i)] := nil;
|
||||
end;
|
||||
for i := 0 to CDDRAWSTYLE_COUNT-1 do
|
||||
begin
|
||||
RegisteredListViewDrawers[TCDDrawStyle(i)].Free;
|
||||
RegisteredListViewDrawers[TCDDrawStyle(i)] := nil;
|
||||
end;
|
||||
for i := 0 to CDDRAWSTYLE_COUNT-1 do
|
||||
begin
|
||||
RegisteredCustomTabControlDrawers[TCDDrawStyle(i)].Free;
|
||||
RegisteredCustomTabControlDrawers[TCDDrawStyle(i)] := nil;
|
||||
end;
|
||||
end.
|
||||
|
||||
|
@ -26,10 +26,6 @@ procedure DrawAndroidButton(Canvas: TCanvas; Color: TColor);
|
||||
procedure DrawXPTaskbarButton(Canvas: TCanvas; Color: TColor);
|
||||
procedure FPImgCloneRect(IntfImg1, IntfImg2: TLazIntfImage; lRect: TRect; Fast: boolean);
|
||||
function GetUniqueName(const Name: string; PControl: TComponent): string;
|
||||
procedure DrawTabHead(aDest: TFPCustomCanvas; aRect: TRect; HeadColor: TColor;
|
||||
IsActive: boolean);
|
||||
procedure DrawTabHeadMask(aDest: TFPCustomCanvas; aRect: TRect;
|
||||
HeadColor: TColor; IsActive: boolean);
|
||||
procedure DrawArrow(aDest: TFPCustomCanvas; aRect: TRect; R: boolean);
|
||||
procedure DrawCDButtonDown(Canvas: TCanvas; ABackgroundColor: TColor);
|
||||
|
||||
@ -78,112 +74,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure DrawTabHead(aDest: TFPCustomCanvas; aRect: TRect; HeadColor: TColor;
|
||||
IsActive: boolean);
|
||||
var
|
||||
lRect: TRect;
|
||||
CC: TFPColor;
|
||||
begin
|
||||
lRect.Bottom := aRect.Bottom;
|
||||
lRect.Right := aRect.Right;
|
||||
lRect.Left := aRect.Left;
|
||||
lRect.Top := aRect.Top + 3;
|
||||
if not IsActive then
|
||||
GradientFillRect(clWhite, HeadColor, aDest, lREct)
|
||||
else
|
||||
begin
|
||||
aDest.Brush.FPColor := TColorToFPColor(ColorToRGB(HeadColor));
|
||||
aDest.Pen.FPColor := aDest.Brush.FPColor;
|
||||
aDest.Rectangle(lRect);
|
||||
end;
|
||||
aDest.Pen.FPColor := TColorToFPColor(ColorToRGB(clWhite));
|
||||
aDest.Line(lRect.Left + 2, aRect.Top + 1, lRect.Right - 2, aRect.Top + 1);
|
||||
aDest.Line(lRect.Left + 1, aRect.Top + 2, lRect.Right - 1, aRect.Top + 2);
|
||||
ADest.Pen.FPColor := TColorToFPColor(ColorToRGB($009C9B91));
|
||||
aDest.Line(lRect.Left, lRect.Top, lRect.Left, lRect.Bottom);
|
||||
//aDest.Line(lRect.Left + 3, aRect.Top, lRect.Right - 3, aRect.Top);
|
||||
aDest.Line(lRect.Left + 3, aRect.Top, lRect.Right - 2, aRect.Top);
|
||||
aDest.Line(lRect.Right, lRect.Top, lRect.Right, lRect.Bottom);
|
||||
if not IsActive then
|
||||
aDest.Line(aRect.Left, aRect.Bottom - 1, aRect.Right, aRect.Bottom - 1);
|
||||
//aDest.Line();
|
||||
{ aDest.Colors[aRect.Left + 1, aRect.Top + 2] := aDest.Pen.FPColor;
|
||||
aDest.Colors[aRect.Left + 2, aRect.Top + 1] := aDest.Pen.FPColor;
|
||||
aDest.Colors[aRect.Right - 1, aRect.Top + 2] := aDest.Pen.FPColor;
|
||||
aDest.Colors[aRect.Right - 2, aRect.Top + 1] := aDest.Pen.FPColor; }
|
||||
if IsActive then
|
||||
begin
|
||||
aDest.Pen.FPColor := TColorToFPColor(ColorToRGB($003CC7FF));
|
||||
aDest.Line(lRect.Left, aRect.Top + 2, lRect.Right, aRect.Top + 2);
|
||||
aDest.Line(lRect.Left + 1, aRect.Top + 1, lRect.Right - 1, aRect.Top + 1);
|
||||
aDest.Pen.FPColor := TColorToFPColor(ColorToRGB($001CA7DF));
|
||||
aDest.Line(lRect.Left + 2, aRect.Top, lRect.Right - 2, aRect.Top);
|
||||
CC := TColorToFPColor(ColorToRGB($001CA7DF));
|
||||
aDest.Colors[aRect.Left + 1, aRect.Top + 1] := CC;
|
||||
aDest.Colors[aRect.Left, aRect.Top + 2] := CC;
|
||||
aDest.Colors[aRect.Left + 2, aRect.Top] := CC;
|
||||
aDest.Colors[aRect.Right - 1, aRect.Top + 1] := CC;
|
||||
aDest.Colors[aRect.Right, aRect.Top + 2] := CC;
|
||||
aDest.Colors[aRect.Right - 2, aRect.Top] := CC;
|
||||
{ CC := TColorToFPColor(ColorToRGB($005CE7FF));
|
||||
aDest.Colors[aRect.Left, aRect.Top + 1] := CC;
|
||||
aDest.Colors[aRect.Left + 1, aRect.Top] := CC;
|
||||
aDest.Colors[aRect.Left + 2, aRect.Top + 1] := CC;
|
||||
aDest.Colors[aRect.Left + 1, aRect.Top + 2] := CC;
|
||||
aDest.Colors[aRect.Right, aRect.Top + 1] := CC;
|
||||
aDest.Colors[aRect.Right - 1, aRect.Top] := CC;
|
||||
aDest.Colors[aRect.Right - 1, aRect.Top + 2] := CC;
|
||||
aDest.Colors[aRect.Right - 2, aRect.Top + 1] := CC; }
|
||||
end
|
||||
else
|
||||
begin
|
||||
CC := TColorToFPColor(ColorToRGB($00BCBBB1));
|
||||
aDest.Colors[aRect.Left + 1, aRect.Top + 1] := CC;
|
||||
aDest.Colors[aRect.Left, aRect.Top + 2] := CC;
|
||||
aDest.Colors[aRect.Left + 2, aRect.Top] := CC;
|
||||
aDest.Colors[aRect.Right - 1, aRect.Top + 1] := CC;
|
||||
aDest.Colors[aRect.Right, aRect.Top + 2] := CC;
|
||||
aDest.Colors[aRect.Right - 2, aRect.Top] := CC;
|
||||
CC := TColorToFPColor(ColorToRGB($00DCDBD1));
|
||||
aDest.Colors[aRect.Left, aRect.Top + 1] := CC;
|
||||
aDest.Colors[aRect.Left + 1, aRect.Top] := CC;
|
||||
aDest.Colors[aRect.Left + 2, aRect.Top + 1] := CC;
|
||||
aDest.Colors[aRect.Left + 1, aRect.Top + 2] := CC;
|
||||
aDest.Colors[aRect.Right, aRect.Top + 1] := CC;
|
||||
aDest.Colors[aRect.Right - 1, aRect.Top] := CC;
|
||||
aDest.Colors[aRect.Right - 1, aRect.Top + 2] := CC;
|
||||
aDest.Colors[aRect.Right - 2, aRect.Top + 1] := CC;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure DrawTabHeadMask(aDest: TFPCustomCanvas; aRect: TRect;
|
||||
HeadColor: TColor; IsActive: boolean);
|
||||
var
|
||||
lRect: TRect;
|
||||
CC: TFPColor;
|
||||
begin
|
||||
lRect.Bottom := aRect.Bottom;
|
||||
lRect.Right := aRect.Right;
|
||||
lRect.Left := aRect.Left;
|
||||
lRect.Top := aRect.Top + 3;
|
||||
CC := TColorToFPColor(ColorToRGB(HeadColor));
|
||||
aDest.Pen.FPColor := CC;
|
||||
aDest.Brush.FPColor := CC;
|
||||
aDest.Rectangle(lRect);
|
||||
aDest.Line(lRect.Left, lRect.Top, lRect.Left, lRect.Bottom);
|
||||
aDest.Line(lRect.Left + 3, aRect.Top, lRect.Right - 2, aRect.Top);
|
||||
aDest.Line(lRect.Right, lRect.Top, lRect.Right, lRect.Bottom);
|
||||
aDest.Line(aRect.Left, aRect.Bottom - 1, aRect.Right, aRect.Bottom - 1);
|
||||
aDest.Line(lRect.Left + 1, lRect.Top - 1, lRect.Right, lRect.Top - 1);
|
||||
aDest.Line(lRect.Left + 2, lRect.Top - 2, lRect.Right - 1, lRect.Top - 2);
|
||||
aDest.Colors[aRect.Left + 1, aRect.Top + 1] := CC;
|
||||
aDest.Colors[aRect.Left, aRect.Top + 2] := CC;
|
||||
aDest.Colors[aRect.Left + 2, aRect.Top] := CC;
|
||||
aDest.Colors[aRect.Right - 1, aRect.Top + 1] := CC;
|
||||
aDest.Colors[aRect.Right, aRect.Top + 2] := CC;
|
||||
aDest.Colors[aRect.Right - 2, aRect.Top] := CC;
|
||||
end;
|
||||
|
||||
function GetUniqueName(const Name: string; PControl: TComponent): string;
|
||||
var
|
||||
i: integer;
|
||||
|
Loading…
Reference in New Issue
Block a user