LCL-CustomDrawn and CustomDrawn: Advances the migration to TFPCustomCanvas which allowed to support TUpDown and TSpeedButton in LCL-CustomDrawn

git-svn-id: trunk@36155 -
This commit is contained in:
sekelsenmat 2012-03-18 22:25:18 +00:00
parent 67188bf7b7
commit 0ef97f99db
7 changed files with 216 additions and 195 deletions

View File

@ -57,7 +57,7 @@ type
// Standard Tab // Standard Tab
// =================================== // ===================================
// TCDButton // TCDButton
procedure DrawButton(ADest: TCanvas; ASize: TSize; procedure DrawButton(ADest: TFPCustomCanvas; ASize: TSize;
AState: TCDControlState; AStateEx: TCDButtonStateEx); override; AState: TCDControlState; AStateEx: TCDButtonStateEx); override;
{ // TCDEdit { // TCDEdit
procedure DrawEditBackground(ADest: TCanvas; ADestPos: TPoint; ASize: TSize; procedure DrawEditBackground(ADest: TCanvas; ADestPos: TPoint; ASize: TSize;
@ -310,9 +310,10 @@ begin
// Don't draw anything, tickmarks are impressed into the general images // Don't draw anything, tickmarks are impressed into the general images
end; end;
procedure TCDDrawerAndroid.DrawButton(ADest: TCanvas; ASize: TSize; procedure TCDDrawerAndroid.DrawButton(ADest: TFPCustomCanvas; ASize: TSize;
AState: TCDControlState; AStateEx: TCDButtonStateEx); AState: TCDControlState; AStateEx: TCDButtonStateEx);
var var
lDest: TCanvas absolute ADest;
Str: string; Str: string;
lGlyphLeftSpacing: Integer = 0; lGlyphLeftSpacing: Integer = 0;
lTextOutPos: TPoint; lTextOutPos: TPoint;
@ -320,90 +321,91 @@ var
lColor: TColor; lColor: TColor;
lRect: TRect; lRect: TRect;
begin begin
if not (ADest is TCanvas) then Exit; // ToDo
// Background corners // Background corners
lColor := AStateEx.ParentRGBColor; lColor := AStateEx.ParentRGBColor;
ADest.Pixels[0, 0] := lColor; lDest.Pixels[0, 0] := lColor;
ADest.Pixels[1, 0] := lColor; lDest.Pixels[1, 0] := lColor;
ADest.Pixels[0, 1] := lColor; lDest.Pixels[0, 1] := lColor;
ADest.Pixels[ASize.cx-1, 0] := lColor; lDest.Pixels[ASize.cx-1, 0] := lColor;
ADest.Pixels[ASize.cx-2, 0] := lColor; lDest.Pixels[ASize.cx-2, 0] := lColor;
ADest.Pixels[ASize.cx-1, 1] := lColor; lDest.Pixels[ASize.cx-1, 1] := lColor;
ADest.Pixels[0, ASize.cy-1] := lColor; lDest.Pixels[0, ASize.cy-1] := lColor;
ADest.Pixels[1, ASize.cy-1] := lColor; lDest.Pixels[1, ASize.cy-1] := lColor;
ADest.Pixels[0, ASize.cy-2] := lColor; lDest.Pixels[0, ASize.cy-2] := lColor;
ADest.Pixels[ASize.cx-1, ASize.cy-1] := lColor; lDest.Pixels[ASize.cx-1, ASize.cy-1] := lColor;
ADest.Pixels[ASize.cx-2, ASize.cy-1] := lColor; lDest.Pixels[ASize.cx-2, ASize.cy-1] := lColor;
ADest.Pixels[ASize.cx-1, ASize.cy-2] := lColor; lDest.Pixels[ASize.cx-1, ASize.cy-2] := lColor;
// Darker corners // Darker corners
lColor := ANDROID_BUTTON_CORNERS; lColor := ANDROID_BUTTON_CORNERS;
ADest.Pixels[1, 1] := lColor; lDest.Pixels[1, 1] := lColor;
ADest.Pixels[2, 0] := lColor; lDest.Pixels[2, 0] := lColor;
ADest.Pixels[0, 2] := lColor; lDest.Pixels[0, 2] := lColor;
ADest.Pixels[ASize.cx-3, 0] := lColor; lDest.Pixels[ASize.cx-3, 0] := lColor;
ADest.Pixels[ASize.cx-2, 1] := lColor; lDest.Pixels[ASize.cx-2, 1] := lColor;
ADest.Pixels[ASize.cx-1, 2] := lColor; lDest.Pixels[ASize.cx-1, 2] := lColor;
ADest.Pixels[0, ASize.cy-3] := lColor; lDest.Pixels[0, ASize.cy-3] := lColor;
ADest.Pixels[1, ASize.cy-2] := lColor; lDest.Pixels[1, ASize.cy-2] := lColor;
ADest.Pixels[2, ASize.cy-1] := lColor; lDest.Pixels[2, ASize.cy-1] := lColor;
ADest.Pixels[ASize.cx-1, ASize.cy-3] := lColor; lDest.Pixels[ASize.cx-1, ASize.cy-3] := lColor;
ADest.Pixels[ASize.cx-2, ASize.cy-2] := lColor; lDest.Pixels[ASize.cx-2, ASize.cy-2] := lColor;
ADest.Pixels[ASize.cx-3, ASize.cy-1] := lColor; lDest.Pixels[ASize.cx-3, ASize.cy-1] := lColor;
// Button image // Button image
if csfSunken in AState then if csfSunken in AState then
begin begin
// Top lines // Top lines
DrawAndroidAlternatedHorzLine(ADest, 3, ASize.cx-3, 0, ANDROID_BUTTON_SUNKEN_FIRST_LINE_A, ANDROID_BUTTON_SUNKEN_FIRST_LINE_B); DrawAndroidAlternatedHorzLine(lDest, 3, ASize.cx-3, 0, ANDROID_BUTTON_SUNKEN_FIRST_LINE_A, ANDROID_BUTTON_SUNKEN_FIRST_LINE_B);
DrawAndroidAlternatedHorzLine(ADest, 2, ASize.cx-2, 1, ANDROID_BUTTON_SUNKEN_SECOND_LINE_A, ANDROID_BUTTON_SUNKEN_SECOND_LINE_B); DrawAndroidAlternatedHorzLine(lDest, 2, ASize.cx-2, 1, ANDROID_BUTTON_SUNKEN_SECOND_LINE_A, ANDROID_BUTTON_SUNKEN_SECOND_LINE_B);
DrawAndroidAlternatedHorzLine(ADest, 1, ASize.cx-1, 2, ANDROID_BUTTON_SUNKEN_THIRD_LINE_A, ANDROID_BUTTON_SUNKEN_THIRD_LINE_B); DrawAndroidAlternatedHorzLine(lDest, 1, ASize.cx-1, 2, ANDROID_BUTTON_SUNKEN_THIRD_LINE_A, ANDROID_BUTTON_SUNKEN_THIRD_LINE_B);
// The central gradient // The central gradient
lRect := Bounds(0, 3, ASize.cx, (ASize.cy-6) div 3+1); lRect := Bounds(0, 3, ASize.cx, (ASize.cy-6) div 3+1);
DrawAndroidMixedVertGradientFill(ADest, lRect, ANDROID_BUTTON_SUNKEN_TOP_GRADIENT_A, DrawAndroidMixedVertGradientFill(lDest, lRect, ANDROID_BUTTON_SUNKEN_TOP_GRADIENT_A,
ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_A, ANDROID_BUTTON_SUNKEN_TOP_GRADIENT_B, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_B); ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_A, ANDROID_BUTTON_SUNKEN_TOP_GRADIENT_B, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_B);
lRect := Bounds(0, 3+(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3+1); lRect := Bounds(0, 3+(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3+1);
DrawAndroidMixedFill(ADest, lRect, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_A, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_B); DrawAndroidMixedFill(lDest, lRect, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_A, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_B);
lRect := Bounds(0, 3+2*(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3+1); lRect := Bounds(0, 3+2*(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3+1);
DrawAndroidMixedVertGradientFill(ADest, lRect, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_A, DrawAndroidMixedVertGradientFill(lDest, lRect, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_A,
ANDROID_BUTTON_SUNKEN_BOTTOM_GRADIENT_A, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_B, ANDROID_BUTTON_SUNKEN_BOTTOM_GRADIENT_B); ANDROID_BUTTON_SUNKEN_BOTTOM_GRADIENT_A, ANDROID_BUTTON_SUNKEN_MIDDLE_GRADIENT_B, ANDROID_BUTTON_SUNKEN_BOTTOM_GRADIENT_B);
// Bottom lines // Bottom lines
DrawAndroidAlternatedHorzLine(ADest, 1, ASize.cx-1, ASize.cy-3, ANDROID_BUTTON_SUNKEN_PREPRELAST_LINE_A, ANDROID_BUTTON_SUNKEN_PREPRELAST_LINE_B); DrawAndroidAlternatedHorzLine(lDest, 1, ASize.cx-1, ASize.cy-3, ANDROID_BUTTON_SUNKEN_PREPRELAST_LINE_A, ANDROID_BUTTON_SUNKEN_PREPRELAST_LINE_B);
DrawAndroidAlternatedHorzLine(ADest, 2, ASize.cx-2, ASize.cy-2, ANDROID_BUTTON_SUNKEN_PRELAST_LINE_A, ANDROID_BUTTON_SUNKEN_PRELAST_LINE_B); DrawAndroidAlternatedHorzLine(lDest, 2, ASize.cx-2, ASize.cy-2, ANDROID_BUTTON_SUNKEN_PRELAST_LINE_A, ANDROID_BUTTON_SUNKEN_PRELAST_LINE_B);
DrawAndroidAlternatedHorzLine(ADest, 3, ASize.cx-3, ASize.cy-1, ANDROID_BUTTON_SUNKEN_LAST_LINE_A, ANDROID_BUTTON_SUNKEN_LAST_LINE_B); DrawAndroidAlternatedHorzLine(lDest, 3, ASize.cx-3, ASize.cy-1, ANDROID_BUTTON_SUNKEN_LAST_LINE_A, ANDROID_BUTTON_SUNKEN_LAST_LINE_B);
end end
else else
begin begin
// Top lines // Top lines
DrawAndroidAlternatedHorzLine(ADest, 3, ASize.cx-3, 0, ANDROID_BUTTON_FIRST_LINE_A, ANDROID_BUTTON_FIRST_LINE_B); DrawAndroidAlternatedHorzLine(lDest, 3, ASize.cx-3, 0, ANDROID_BUTTON_FIRST_LINE_A, ANDROID_BUTTON_FIRST_LINE_B);
DrawAndroidAlternatedHorzLine(ADest, 2, ASize.cx-2, 1, ANDROID_BUTTON_SECOND_LINE_A, ANDROID_BUTTON_SECOND_LINE_B); DrawAndroidAlternatedHorzLine(lDest, 2, ASize.cx-2, 1, ANDROID_BUTTON_SECOND_LINE_A, ANDROID_BUTTON_SECOND_LINE_B);
DrawAndroidAlternatedHorzLine(ADest, 1, ASize.cx-1, 2, ANDROID_BUTTON_THIRD_LINE_A, ANDROID_BUTTON_THIRD_LINE_B); DrawAndroidAlternatedHorzLine(lDest, 1, ASize.cx-1, 2, ANDROID_BUTTON_THIRD_LINE_A, ANDROID_BUTTON_THIRD_LINE_B);
// The central gradient // The central gradient
lRect := Bounds(0, 3, ASize.cx, (ASize.cy-6) div 3+1); lRect := Bounds(0, 3, ASize.cx, (ASize.cy-6) div 3+1);
DrawAndroidMixedVertGradientFill(ADest, lRect, ANDROID_BUTTON_TOP_GRADIENT_A, DrawAndroidMixedVertGradientFill(lDest, lRect, ANDROID_BUTTON_TOP_GRADIENT_A,
ANDROID_BUTTON_MIDDLE_GRADIENT_A, ANDROID_BUTTON_TOP_GRADIENT_B, ANDROID_BUTTON_MIDDLE_GRADIENT_B); ANDROID_BUTTON_MIDDLE_GRADIENT_A, ANDROID_BUTTON_TOP_GRADIENT_B, ANDROID_BUTTON_MIDDLE_GRADIENT_B);
lRect := Bounds(0, 3+(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3+1); lRect := Bounds(0, 3+(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3+1);
DrawAndroidMixedFill(ADest, lRect, ANDROID_BUTTON_MIDDLE_GRADIENT_A, ANDROID_BUTTON_MIDDLE_GRADIENT_B); DrawAndroidMixedFill(lDest, lRect, ANDROID_BUTTON_MIDDLE_GRADIENT_A, ANDROID_BUTTON_MIDDLE_GRADIENT_B);
lRect := Bounds(0, 3+2*(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3+1); lRect := Bounds(0, 3+2*(ASize.cy-6) div 3, ASize.cx, (ASize.cy-6) div 3+1);
DrawAndroidMixedVertGradientFill(ADest, lRect, ANDROID_BUTTON_MIDDLE_GRADIENT_A, DrawAndroidMixedVertGradientFill(lDest, lRect, ANDROID_BUTTON_MIDDLE_GRADIENT_A,
ANDROID_BUTTON_BOTTOM_GRADIENT_A, ANDROID_BUTTON_MIDDLE_GRADIENT_B, ANDROID_BUTTON_BOTTOM_GRADIENT_B); ANDROID_BUTTON_BOTTOM_GRADIENT_A, ANDROID_BUTTON_MIDDLE_GRADIENT_B, ANDROID_BUTTON_BOTTOM_GRADIENT_B);
// Bottom lines // Bottom lines
DrawAndroidAlternatedHorzLine(ADest, 1, ASize.cx-1, ASize.cy-3, ANDROID_BUTTON_PREPRELAST_LINE_A, ANDROID_BUTTON_PREPRELAST_LINE_B); DrawAndroidAlternatedHorzLine(lDest, 1, ASize.cx-1, ASize.cy-3, ANDROID_BUTTON_PREPRELAST_LINE_A, ANDROID_BUTTON_PREPRELAST_LINE_B);
DrawAndroidAlternatedHorzLine(ADest, 2, ASize.cx-2, ASize.cy-2, ANDROID_BUTTON_PRELAST_LINE_A, ANDROID_BUTTON_PRELAST_LINE_B); DrawAndroidAlternatedHorzLine(lDest, 2, ASize.cx-2, ASize.cy-2, ANDROID_BUTTON_PRELAST_LINE_A, ANDROID_BUTTON_PRELAST_LINE_B);
DrawAndroidAlternatedHorzLine(ADest, 3, ASize.cx-3, ASize.cy-1, ANDROID_BUTTON_LAST_LINE_A, ANDROID_BUTTON_LAST_LINE_B); DrawAndroidAlternatedHorzLine(lDest, 3, ASize.cx-3, ASize.cy-1, ANDROID_BUTTON_LAST_LINE_A, ANDROID_BUTTON_LAST_LINE_B);
end; end;
if csfHasFocus in AState then if csfHasFocus in AState then
DrawFocusRect(ADest, Point(5, 5), Size(ASize.cx-10, ASize.cy-10)); DrawFocusRect(lDest, Point(5, 5), Size(ASize.cx-10, ASize.cy-10));
// Position calculations // Position calculations
ADest.Font.Assign(AStateEx.Font); ADest.Font.Assign(AStateEx.Font);
Str := AStateEx.Caption; Str := AStateEx.Caption;
lGlyphCaptionHeight := Max(ADest.TextHeight(Str), AStateEx.Glyph.Height); lGlyphCaptionHeight := Max(lDest.TextHeight(Str), AStateEx.Glyph.Height);
lTextOutPos.X := (ASize.cx - ADest.TextWidth(Str) - AStateEx.Glyph.Width) div 2; lTextOutPos.X := (ASize.cx - lDest.TextWidth(Str) - AStateEx.Glyph.Width) div 2;
lTextOutPos.Y := (ASize.cy - lGlyphCaptionHeight) div 2; lTextOutPos.Y := (ASize.cy - lGlyphCaptionHeight) div 2;
lTextOutPos.X := Max(lTextOutPos.X, 5); lTextOutPos.X := Max(lTextOutPos.X, 5);
lTextOutPos.Y := Max(lTextOutPos.Y, 5); lTextOutPos.Y := Max(lTextOutPos.Y, 5);
@ -411,13 +413,13 @@ begin
// Button glyph // Button glyph
if not AStateEx.Glyph.Empty then if not AStateEx.Glyph.Empty then
begin begin
ADest.Draw(lTextOutPos.X, lTextOutPos.Y, AStateEx.Glyph); lDest.Draw(lTextOutPos.X, lTextOutPos.Y, AStateEx.Glyph);
lGlyphLeftSpacing := AStateEx.Glyph.Width+5; lGlyphLeftSpacing := AStateEx.Glyph.Width+5;
end; end;
// Button text // Button text
lTextOutPos.X := lTextOutPos.X + lGlyphLeftSpacing; lTextOutPos.X := lTextOutPos.X + lGlyphLeftSpacing;
lTextOutPos.Y := (ASize.cy - ADest.TextHeight(Str)) div 2; lTextOutPos.Y := (ASize.cy - lDest.TextHeight(Str)) div 2;
ADest.Brush.Style := bsClear; ADest.Brush.Style := bsClear;
ADest.Pen.Style := psSolid; ADest.Pen.Style := psSolid;
if csfSunken in AState then if csfSunken in AState then
@ -425,7 +427,7 @@ begin
Inc(lTextOutPos.X); Inc(lTextOutPos.X);
Inc(lTextOutPos.Y); Inc(lTextOutPos.Y);
end; end;
ADest.TextOut(lTextOutPos.X, lTextOutPos.Y, Str) lDest.TextOut(lTextOutPos.X, lTextOutPos.Y, Str)
end; end;
procedure TCDDrawerAndroid.DrawCheckBoxSquare(ADest: TCanvas; ADestPos: TPoint; procedure TCDDrawerAndroid.DrawCheckBoxSquare(ADest: TCanvas; ADestPos: TPoint;

View File

@ -32,7 +32,7 @@ type
// Standard Tab // Standard Tab
// =================================== // ===================================
// TCDButton // TCDButton
procedure DrawButton(ADest: TCanvas; ASize: TSize; procedure DrawButton(ADest: TFPCustomCanvas; ASize: TSize;
AState: TCDControlState; AStateEx: TCDButtonStateEx); override; AState: TCDControlState; AStateEx: TCDButtonStateEx); override;
// TCDEdit // TCDEdit
procedure DrawEditFrame(ADest: TCanvas; ADestPos: TPoint; ASize: TSize; procedure DrawEditFrame(ADest: TCanvas; ADestPos: TPoint; ASize: TSize;
@ -85,41 +85,43 @@ begin
ADest.Rectangle(Bounds(ADestPos.X, ADestPos.Y, ASize.cx, ASize.cy)); ADest.Rectangle(Bounds(ADestPos.X, ADestPos.Y, ASize.cx, ASize.cy));
end; end;
procedure TCDDrawerWinCE.DrawButton(ADest: TCanvas; procedure TCDDrawerWinCE.DrawButton(ADest: TFPCustomCanvas;
ASize: TSize; AState: TCDControlState; AStateEx: TCDButtonStateEx); ASize: TSize; AState: TCDControlState; AStateEx: TCDButtonStateEx);
var var
lDest: TCanvas absolute ADest;
Str: string; Str: string;
begin begin
if not (ADest is TCanvas) then Exit; // ToDo support non-TCanvas
// Button background // Button background
if csfSunken in AState then if csfSunken in AState then
begin begin
ADest.Brush.Style := bsSolid; ADest.Brush.Style := bsSolid;
ADest.Brush.Color := Palette.BtnShadow; lDest.Brush.Color := Palette.BtnShadow;
ADest.Pen.Color := clBlack; lDest.Pen.Color := clBlack;
ADest.Pen.Style := psSolid; ADest.Pen.Style := psSolid;
ADest.Rectangle(0, 0, ASize.cx, ASize.cy); ADest.Rectangle(0, 0, ASize.cx, ASize.cy);
end end
else else
begin begin
ADest.Brush.Style := bsSolid; ADest.Brush.Style := bsSolid;
ADest.Brush.Color := AStateEx.RGBColor; lDest.Brush.Color := AStateEx.RGBColor;
ADest.Pen.Color := clBlack; lDest.Pen.Color := clBlack;
ADest.Pen.Style := psSolid; ADest.Pen.Style := psSolid;
ADest.Rectangle(0, 0, ASize.cx, ASize.cy); ADest.Rectangle(0, 0, ASize.cx, ASize.cy);
end; end;
// Focus // Focus
if (csfHasFocus in AState) and not (csfSunken in AState) then if (csfHasFocus in AState) and not (csfSunken in AState) then
DrawFocusRect(ADest, Point(4, 4), Size(ASize.cx-8, ASize.cy-8)); DrawFocusRect(lDest, Point(4, 4), Size(ASize.cx-8, ASize.cy-8));
// Button text // Button text
ADest.Font.Assign(AStateEx.Font); ADest.Font.Assign(AStateEx.Font);
ADest.Brush.Style := bsClear; ADest.Brush.Style := bsClear;
ADest.Pen.Style := psSolid; ADest.Pen.Style := psSolid;
if csfSunken in AState then ADest.Font.Color := clWhite; if csfSunken in AState then lDest.Font.Color := clWhite;
Str := AStateEx.Caption; Str := AStateEx.Caption;
ADest.TextOut((ASize.cx - ADest.TextWidth(Str)) div 2, lDest.TextOut((ASize.cx - lDest.TextWidth(Str)) div 2,
(ASize.cy - ADest.TextHeight(Str)) div 2, Str); (ASize.cy - lDest.TextHeight(Str)) div 2, Str);
end; end;
procedure TCDDrawerWinCE.DrawEditFrame(ADest: TCanvas; ADestPos: TPoint; procedure TCDDrawerWinCE.DrawEditFrame(ADest: TCanvas; ADestPos: TPoint;

View File

@ -6,7 +6,7 @@ interface
uses uses
// RTL // RTL
Classes, SysUtils, Types, Classes, SysUtils, Types, fpcanvas, fpimage,
// LCL -> Use only TForm, TWinControl, TCanvas and TLazIntfImage // LCL -> Use only TForm, TWinControl, TCanvas and TLazIntfImage
Graphics, Controls, LCLType, Graphics, Controls, LCLType,
// //
@ -38,7 +38,7 @@ type
// Standard Tab // Standard Tab
// =================================== // ===================================
// TCDButton // TCDButton
procedure DrawButton(ADest: TCanvas; ASize: TSize; procedure DrawButton(ADest: TFPCustomCanvas; ASize: TSize;
AState: TCDControlState; AStateEx: TCDButtonStateEx); override; AState: TCDControlState; AStateEx: TCDButtonStateEx); override;
// TCDEdit // TCDEdit
procedure DrawEditFrame(ADest: TCanvas; ADestPos: TPoint; ASize: TSize; procedure DrawEditFrame(ADest: TCanvas; ADestPos: TPoint; ASize: TSize;
@ -152,9 +152,10 @@ begin
ADest.Line(ADestPos.X+i, ADestPos.Y+4-i, ADestPos.X+i, ADestPos.Y+3+4-i); ADest.Line(ADestPos.X+i, ADestPos.Y+4-i, ADestPos.X+i, ADestPos.Y+3+4-i);
end; end;
procedure TCDDrawerWinXP.DrawButton(ADest: TCanvas; procedure TCDDrawerWinXP.DrawButton(ADest: TFPCustomCanvas;
ASize: TSize; AState: TCDControlState; AStateEx: TCDButtonStateEx); ASize: TSize; AState: TCDControlState; AStateEx: TCDButtonStateEx);
var var
lDest: TCanvas absolute ADest;
Str: string; Str: string;
lColor: TColor; lColor: TColor;
lRect: TRect; lRect: TRect;
@ -163,39 +164,39 @@ var
begin begin
// Background corners // Background corners
lColor := AStateEx.ParentRGBColor; lColor := AStateEx.ParentRGBColor;
ADest.Pixels[0, 0] := lColor; lDest.Pixels[0, 0] := lColor;
ADest.Pixels[ASize.cx-1, 0] := lColor; lDest.Pixels[ASize.cx-1, 0] := lColor;
ADest.Pixels[0, ASize.cy-1] := lColor; lDest.Pixels[0, ASize.cy-1] := lColor;
ADest.Pixels[ASize.cx-1, ASize.cy-1] := lColor; lDest.Pixels[ASize.cx-1, ASize.cy-1] := lColor;
// Main body // Main body
if csfSunken in AState then if csfSunken in AState then
begin begin
ADest.Brush.Style := bsSolid; ADest.Brush.Style := bsSolid;
ADest.Brush.Color := WINXP_BUTTON_SUNKEN_BODY_BOTTOM; lDest.Brush.Color := WINXP_BUTTON_SUNKEN_BODY_BOTTOM;
ADest.Pen.Color := WINXP_BUTTON_SUNKEN_BODY_BOTTOM; lDest.Pen.Color := WINXP_BUTTON_SUNKEN_BODY_BOTTOM;
ADest.Rectangle(1, 1, ASize.cx-1, ASize.cy-1); ADest.Rectangle(1, 1, ASize.cx-1, ASize.cy-1);
end end
else if csfEnabled in AState then else if csfEnabled in AState then
begin begin
// First the gradient // First the gradient
lRect := Bounds(1, 1, ASize.cx-4, ASize.cy-5); lRect := Bounds(1, 1, ASize.cx-4, ASize.cy-5);
ADest.GradientFill(lRect, WINXP_BUTTON_BODY_TOP, WINXP_BUTTON_BODY_BOTTOM, gdVertical); lDest.GradientFill(lRect, WINXP_BUTTON_BODY_TOP, WINXP_BUTTON_BODY_BOTTOM, gdVertical);
// Now the extra lines which make the bottom-right // Now the extra lines which make the bottom-right
ADest.Pen.Color := WINXP_BUTTON_BODY_LINES_PREPRELAST; lDest.Pen.Color := WINXP_BUTTON_BODY_LINES_PREPRELAST;
ADest.Line(1, ASize.cy-4, ASize.cx-3, ASize.cy-4); ADest.Line(1, ASize.cy-4, ASize.cx-3, ASize.cy-4);
ADest.Line(ASize.cx-3, ASize.cy-4, ASize.cx-3, 1); ADest.Line(ASize.cx-3, ASize.cy-4, ASize.cx-3, 1);
ADest.Pen.Color := WINXP_BUTTON_BODY_LINES_PRELAST; lDest.Pen.Color := WINXP_BUTTON_BODY_LINES_PRELAST;
ADest.Line(2, ASize.cy-3, ASize.cx-2, ASize.cy-3); ADest.Line(2, ASize.cy-3, ASize.cx-2, ASize.cy-3);
ADest.Line(ASize.cx-2, ASize.cy-3, ASize.cx-2, 2); ADest.Line(ASize.cx-2, ASize.cy-3, ASize.cx-2, 2);
ADest.Pen.Color := WINXP_BUTTON_BODY_LINES_LAST; lDest.Pen.Color := WINXP_BUTTON_BODY_LINES_LAST;
ADest.Line(3, ASize.cy-1, ASize.cx-3, ASize.cy-1); ADest.Line(3, ASize.cy-1, ASize.cx-3, ASize.cy-1);
end end
else // disabled else // disabled
begin begin
ADest.Brush.Style := bsSolid; ADest.Brush.Style := bsSolid;
ADest.Brush.Color := WINXP_BUTTON_DISABLED_BODY; lDest.Brush.Color := WINXP_BUTTON_DISABLED_BODY;
ADest.Pen.Color := WINXP_BUTTON_DISABLED_BODY; lDest.Pen.Color := WINXP_BUTTON_DISABLED_BODY;
ADest.Rectangle(1, 1, ASize.cx-1, ASize.cy-1); ADest.Rectangle(1, 1, ASize.cx-1, ASize.cy-1);
end; end;
@ -215,35 +216,35 @@ begin
lFrameLight := WINXP_BUTTON_FRAME_LIGHT_DISABLED; lFrameLight := WINXP_BUTTON_FRAME_LIGHT_DISABLED;
end; end;
ADest.Pixels[1, 0] := lFrameMedium; lDest.Pixels[1, 0] := lFrameMedium;
ADest.Pixels[0, 1] := lFrameMedium; lDest.Pixels[0, 1] := lFrameMedium;
ADest.Pixels[1, 1] := lFrameMedDark; lDest.Pixels[1, 1] := lFrameMedDark;
ADest.Pixels[2, 1] := lFrameLight; lDest.Pixels[2, 1] := lFrameLight;
ADest.Pixels[1, 2] := lFrameLight; lDest.Pixels[1, 2] := lFrameLight;
ADest.Pixels[ASize.cx-2, 0] := lFrameMedium; lDest.Pixels[ASize.cx-2, 0] := lFrameMedium;
ADest.Pixels[ASize.cx-1, 1] := lFrameMedium; lDest.Pixels[ASize.cx-1, 1] := lFrameMedium;
ADest.Pixels[ASize.cx-2, 1] := lFrameMedDark; lDest.Pixels[ASize.cx-2, 1] := lFrameMedDark;
ADest.Pixels[ASize.cx-3, 1] := lFrameLight; lDest.Pixels[ASize.cx-3, 1] := lFrameLight;
ADest.Pixels[ASize.cx-2, 2] := lFrameLight; lDest.Pixels[ASize.cx-2, 2] := lFrameLight;
ADest.Pixels[1, ASize.cy-1] := lFrameMedium; lDest.Pixels[1, ASize.cy-1] := lFrameMedium;
ADest.Pixels[0, ASize.cy-2] := lFrameMedium; lDest.Pixels[0, ASize.cy-2] := lFrameMedium;
ADest.Pixels[1, ASize.cy-2] := lFrameMedDark; lDest.Pixels[1, ASize.cy-2] := lFrameMedDark;
ADest.Pixels[2, ASize.cy-2] := lFrameLight; lDest.Pixels[2, ASize.cy-2] := lFrameLight;
ADest.Pixels[1, ASize.cy-3] := lFrameLight; lDest.Pixels[1, ASize.cy-3] := lFrameLight;
ADest.Pixels[ASize.cx-2, ASize.cy-1] := lFrameMedium; lDest.Pixels[ASize.cx-2, ASize.cy-1] := lFrameMedium;
ADest.Pixels[ASize.cx-1, ASize.cy-2] := lFrameMedium; lDest.Pixels[ASize.cx-1, ASize.cy-2] := lFrameMedium;
ADest.Pixels[ASize.cx-2, ASize.cy-2] := lFrameMedDark; lDest.Pixels[ASize.cx-2, ASize.cy-2] := lFrameMedDark;
ADest.Pixels[ASize.cx-3, ASize.cy-2] := lFrameLight; lDest.Pixels[ASize.cx-3, ASize.cy-2] := lFrameLight;
ADest.Pixels[ASize.cx-2, ASize.cy-3] := lFrameLight; lDest.Pixels[ASize.cx-2, ASize.cy-3] := lFrameLight;
ADest.Pen.Color := lFrameDark; lDest.Pen.Color := lFrameDark;
ADest.Line(2, 0, ASize.cx-2, 0); lDest.Line(2, 0, ASize.cx-2, 0);
ADest.Line(2, ASize.cy-1, ASize.cx-2, ASize.cy-1); lDest.Line(2, ASize.cy-1, ASize.cx-2, ASize.cy-1);
ADest.Line(0, 2, 0, ASize.cy-2); lDest.Line(0, 2, 0, ASize.cy-2);
ADest.Line(ASize.cx-1, 2, ASize.cx-1, ASize.cy-2); lDest.Line(ASize.cx-1, 2, ASize.cx-1, ASize.cy-2);
// Now focus / mouseover indication, note that both disappear when sunked in WinXP // Now focus / mouseover indication, note that both disappear when sunked in WinXP
if ((csfHasFocus in AState) or (csfMouseOver in AState)) and not (csfSunken in AState) then if ((csfHasFocus in AState) or (csfMouseOver in AState)) and not (csfSunken in AState) then
@ -264,19 +265,19 @@ begin
end; end;
// Top // Top
ADest.Pen.Color := lSelTop; lDest.Pen.Color := lSelTop;
ADest.Line(2, 1, ASize.cx-2, 1); ADest.Line(2, 1, ASize.cx-2, 1);
ADest.Pen.Color := lSelTopGrad; lDest.Pen.Color := lSelTopGrad;
ADest.Line(1, 2, ASize.cx-1, 2); ADest.Line(1, 2, ASize.cx-1, 2);
// Gradient // Gradient
lRect := Bounds(1, 2, 2, ASize.cy-4); lRect := Bounds(1, 2, 2, ASize.cy-4);
ADest.GradientFill(lRect, lSelTopGrad, lSelBottomGrad, gdVertical); lDest.GradientFill(lRect, lSelTopGrad, lSelBottomGrad, gdVertical);
lRect := Bounds(ASize.cx-3, 2, 2, ASize.cy-4); lRect := Bounds(ASize.cx-3, 2, 2, ASize.cy-4);
ADest.GradientFill(lRect, lSelTopGrad, lSelBottomGrad, gdVertical); lDest.GradientFill(lRect, lSelTopGrad, lSelBottomGrad, gdVertical);
// Bottom // Bottom
ADest.Pen.Color := lSelBottomGrad; lDest.Pen.Color := lSelBottomGrad;
ADest.Line(1, ASize.cy-3, ASize.cx-1, ASize.cy-3); ADest.Line(1, ASize.cy-3, ASize.cx-1, ASize.cy-3);
ADest.Pen.Color := lSelBottom; lDest.Pen.Color := lSelBottom;
ADest.Line(2, ASize.cy-2, ASize.cx-2, ASize.cy-2); ADest.Line(2, ASize.cy-2, ASize.cx-2, ASize.cy-2);
end; end;
@ -285,8 +286,8 @@ begin
ADest.Brush.Style := bsClear; ADest.Brush.Style := bsClear;
ADest.Pen.Style := psSolid; ADest.Pen.Style := psSolid;
Str := AStateEx.Caption; Str := AStateEx.Caption;
ADest.TextOut((ASize.cx - ADest.TextWidth(Str)) div 2, lDest.TextOut((ASize.cx - lDest.TextWidth(Str)) div 2,
(ASize.cy - ADest.TextHeight(Str)) div 2, Str); (ASize.cy - lDest.TextHeight(Str)) div 2, Str);
end; end;
procedure TCDDrawerWinXP.DrawEditFrame(ADest: TCanvas; ADestPos: TPoint; procedure TCDDrawerWinXP.DrawEditFrame(ADest: TCanvas; ADestPos: TPoint;

View File

@ -6,7 +6,7 @@ interface
uses uses
// RTL / FCL // RTL / FCL
Classes, SysUtils, Types, Math, fpcanvas, Classes, SysUtils, Types, Math, fpcanvas, fpimage,
// LazUtils // LazUtils
lazutf8, lazutf8,
// LCL -> Use only TForm, TWinControl, TCanvas and TLazIntfImage // LCL -> Use only TForm, TWinControl, TCanvas and TLazIntfImage
@ -55,7 +55,7 @@ type
// Standard Tab // Standard Tab
// =================================== // ===================================
// TCDButton // TCDButton
procedure DrawButton(ADest: TCanvas; ASize: TSize; procedure DrawButton(ADest: TFPCustomCanvas; ASize: TSize;
AState: TCDControlState; AStateEx: TCDButtonStateEx); override; AState: TCDControlState; AStateEx: TCDButtonStateEx); override;
// TCDEdit // TCDEdit
procedure DrawEditBackground(ADest: TCanvas; ADestPos: TPoint; ASize: TSize; procedure DrawEditBackground(ADest: TCanvas; ADestPos: TPoint; ASize: TSize;
@ -638,7 +638,7 @@ begin
ADest.FillRect(0, 0, ASize.cx, ASize.cy); ADest.FillRect(0, 0, ASize.cx, ASize.cy);
end; end;
procedure TCDDrawerCommon.DrawButton(ADest: TCanvas; procedure TCDDrawerCommon.DrawButton(ADest: TFPCustomCanvas;
ASize: TSize; AState: TCDControlState; AStateEx: TCDButtonStateEx); ASize: TSize; AState: TCDControlState; AStateEx: TCDButtonStateEx);
var var
Str: string; Str: string;
@ -648,20 +648,20 @@ var
begin begin
// background // background
ADest.Brush.Style := bsSolid; ADest.Brush.Style := bsSolid;
ADest.Brush.Color := AStateEx.RGBColor; ADest.Brush.FPColor := AStateEx.FPRGBColor;
ADest.Pen.Color := clWhite; ADest.Pen.FPColor := colWhite;
ADest.Pen.Style := psSolid; ADest.Pen.Style := psSolid;
ADest.Rectangle(0, 0, ASize.cx - 1, ASize.cy - 1); ADest.Rectangle(0, 0, ASize.cx - 1, ASize.cy - 1);
ADest.Pen.Color := clWhite; ADest.Pen.FPColor := colWhite;
ADest.Line(0, 0, ASize.cx - 1, 0); ADest.Line(0, 0, ASize.cx - 1, 0);
ADest.Line(0, 0, 0, ASize.cy - 1); ADest.Line(0, 0, 0, ASize.cy - 1);
ADest.Pen.Color := clGray; ADest.Pen.FPColor := colGray;
ADest.Line(0, ASize.cy - 1, ASize.cx - 1, ASize.cy - 1); ADest.Line(0, ASize.cy - 1, ASize.cx - 1, ASize.cy - 1);
ADest.Line(ASize.cx - 1, ASize.cy - 1, ASize.cx - 1, -1); ADest.Line(ASize.cx - 1, ASize.cy - 1, ASize.cx - 1, -1);
ADest.Pen.Color := $0099A8AC; ADest.Pen.FPColor := TColorToFPColor($0099A8AC);
ADest.Line(1, ASize.cy - 2, ASize.cx - 2, ASize.cy - 2); ADest.Line(1, ASize.cy - 2, ASize.cx - 2, ASize.cy - 2);
ADest.Line(ASize.cx - 2, ASize.cx - 2, ASize.cx - 2, 0); ADest.Line(ASize.cx - 2, ASize.cx - 2, ASize.cx - 2, 0);
ADest.Pen.Color := $00E2EFF1; ADest.Pen.FPColor := TColorToFPColor($00E2EFF1);
ADest.Line(1, 1, ASize.cx - 2, 1); ADest.Line(1, 1, ASize.cx - 2, 1);
ADest.Line(1, 1, 1, ASize.cy - 2); ADest.Line(1, 1, 1, ASize.cy - 2);
@ -669,33 +669,36 @@ begin
if csfSunken in AState then if csfSunken in AState then
begin begin
ADest.Brush.Style := bsSolid; ADest.Brush.Style := bsSolid;
ADest.Brush.Color := AStateEx.RGBColor; ADest.Brush.FPColor := AStateEx.FPRGBColor;
ADest.Pen.Color := clWhite; ADest.Pen.FPColor := colWhite;
ADest.Pen.Style := psSolid; ADest.Pen.Style := psSolid;
ADest.Rectangle(0, 0, ASize.cx - 1, ASize.cy - 1); ADest.Rectangle(0, 0, ASize.cx - 1, ASize.cy - 1);
ADest.Pen.Color := clGray; ADest.Pen.FPColor := colGray;
ADest.Line(0, 0, ASize.cx - 1, 0); ADest.Line(0, 0, ASize.cx - 1, 0);
ADest.Line(0, 0, 0, ASize.cy - 1); ADest.Line(0, 0, 0, ASize.cy - 1);
ADest.Pen.Color := clWhite; ADest.Pen.FPColor := colWhite;
ADest.Line(0, ASize.cy - 1, ASize.cx - 1, ASize.cy - 1); ADest.Line(0, ASize.cy - 1, ASize.cx - 1, ASize.cy - 1);
ADest.Line(ASize.cx - 1, ASize.cy - 1, ASize.cx - 1, -1); ADest.Line(ASize.cx - 1, ASize.cy - 1, ASize.cx - 1, -1);
ADest.Pen.Color := $00E2EFF1; ADest.Pen.FPColor := TColorToFPColor($00E2EFF1);
ADest.Line(1, ASize.cy - 2, ASize.cx - 2, ASize.cy - 2); ADest.Line(1, ASize.cy - 2, ASize.cx - 2, ASize.cy - 2);
ADest.Line(ASize.cx - 2, ASize.cy - 2, ASize.cx - 2, 0); ADest.Line(ASize.cx - 2, ASize.cy - 2, ASize.cx - 2, 0);
ADest.Pen.Color := $0099A8AC; ADest.Pen.FPColor := TColorToFPColor($0099A8AC);
ADest.Line(1, 1, ASize.cx - 2, 1); ADest.Line(1, 1, ASize.cx - 2, 1);
ADest.Line(1, 1, 1, ASize.cy - 2); ADest.Line(1, 1, 1, ASize.cy - 2);
end end
else if csfHasFocus in AState then else if csfHasFocus in AState then
begin begin
DrawFocusRect(ADest, Point(3, 3), Size(ASize.cx - 7, ASize.cy - 7)); if ADest is TCanvas then
DrawFocusRect(TCanvas(ADest), Point(3, 3), Size(ASize.cx - 7, ASize.cy - 7));
end; end;
// Position calculations // Position calculations
if ADest is TCanvas then
begin
ADest.Font.Assign(AStateEx.Font); ADest.Font.Assign(AStateEx.Font);
Str := AStateEx.Caption; Str := AStateEx.Caption;
lGlyphCaptionHeight := Max(ADest.TextHeight(Str), AStateEx.Glyph.Height); lGlyphCaptionHeight := Max(TCanvas(ADest).TextHeight(Str), AStateEx.Glyph.Height);
lTextOutPos.X := (ASize.cx - ADest.TextWidth(Str) - AStateEx.Glyph.Width) div 2; lTextOutPos.X := (ASize.cx - TCanvas(ADest).TextWidth(Str) - AStateEx.Glyph.Width) div 2;
lTextOutPos.Y := (ASize.cy - lGlyphCaptionHeight) div 2; lTextOutPos.Y := (ASize.cy - lGlyphCaptionHeight) div 2;
lTextOutPos.X := Max(lTextOutPos.X, 5); lTextOutPos.X := Max(lTextOutPos.X, 5);
lTextOutPos.Y := Max(lTextOutPos.Y, 5); lTextOutPos.Y := Max(lTextOutPos.Y, 5);
@ -703,13 +706,13 @@ begin
// Button glyph // Button glyph
if not AStateEx.Glyph.Empty then if not AStateEx.Glyph.Empty then
begin begin
ADest.Draw(lTextOutPos.X, lTextOutPos.Y, AStateEx.Glyph); TCanvas(ADest).Draw(lTextOutPos.X, lTextOutPos.Y, AStateEx.Glyph);
lGlyphLeftSpacing := AStateEx.Glyph.Width+5; lGlyphLeftSpacing := AStateEx.Glyph.Width+5;
end; end;
// Button text // Button text
lTextOutPos.X := lTextOutPos.X + lGlyphLeftSpacing; lTextOutPos.X := lTextOutPos.X + lGlyphLeftSpacing;
lTextOutPos.Y := (ASize.cy - ADest.TextHeight(Str)) div 2; lTextOutPos.Y := (ASize.cy - TCanvas(ADest).TextHeight(Str)) div 2;
ADest.Brush.Style := bsClear; ADest.Brush.Style := bsClear;
ADest.Pen.Style := psSolid; ADest.Pen.Style := psSolid;
if csfEnabled in AState then if csfEnabled in AState then
@ -724,16 +727,17 @@ begin
else else
begin begin
// The disabled text is composed by a white shadow under it and a grey text // The disabled text is composed by a white shadow under it and a grey text
ADest.Font.Color := clWhite; TCanvas(ADest).Font.Color := clWhite;
Inc(lTextOutPos.X); Inc(lTextOutPos.X);
Inc(lTextOutPos.Y); Inc(lTextOutPos.Y);
ADest.TextOut(lTextOutPos.X, lTextOutPos.Y, Str); TCanvas(ADest).TextOut(lTextOutPos.X, lTextOutPos.Y, Str);
// //
ADest.Font.Color := WIN2000_DISABLED_TEXT; TCanvas(ADest).Font.Color := WIN2000_DISABLED_TEXT;
Dec(lTextOutPos.X); Dec(lTextOutPos.X);
Dec(lTextOutPos.Y); Dec(lTextOutPos.Y);
ADest.TextOut(lTextOutPos.X, lTextOutPos.Y, Str); ADest.TextOut(lTextOutPos.X, lTextOutPos.Y, Str);
end; end;
end;
end; end;
procedure TCDDrawerCommon.DrawEditBackground(ADest: TCanvas; procedure TCDDrawerCommon.DrawEditBackground(ADest: TCanvas;
@ -1175,10 +1179,10 @@ begin
if FCaptionMiddle = 0 then FCaptionMiddle := 5; if FCaptionMiddle = 0 then FCaptionMiddle := 5;
// Background // Background
ADest.Brush.FPColor := TColorToFPColor(AStateEx.ParentRGBColor); ADest.Brush.FPColor := AStateEx.FPParentRGBColor;
ADest.Brush.Style := bsSolid; ADest.Brush.Style := bsSolid;
ADest.Pen.Style := psSolid; ADest.Pen.Style := psSolid;
ADest.Pen.FPColor := TColorToFPColor(AStateEx.ParentRGBColor); ADest.Pen.FPColor := AStateEx.FPParentRGBColor;
ADest.Rectangle(0, 0, ASize.cx, ASize.cy); ADest.Rectangle(0, 0, ASize.cx, ASize.cy);
// frame // frame
@ -1201,7 +1205,7 @@ begin
// fill the text background // fill the text background
ADest.Brush.Style := bsSolid; ADest.Brush.Style := bsSolid;
ADest.Brush.FPColor := TColorToFPColor(AStateEx.ParentRGBColor); ADest.Brush.FPColor := AStateEx.FPParentRGBColor;
ADest.Pen.Style := psClear; ADest.Pen.Style := psClear;
ADest.Rectangle(Bounds(FCaptionMiddle, 0, lTextSize.cx+5, lTextSize.cy)); ADest.Rectangle(Bounds(FCaptionMiddle, 0, lTextSize.cx+5, lTextSize.cy));

View File

@ -810,9 +810,11 @@ procedure TCDControl.PrepareControlStateEx;
begin begin
if Parent <> nil then FStateEx.ParentRGBColor := Parent.GetRGBColorResolvingParent if Parent <> nil then FStateEx.ParentRGBColor := Parent.GetRGBColorResolvingParent
else FStateEx.ParentRGBColor := clSilver; else FStateEx.ParentRGBColor := clSilver;
FStateEx.FPParentRGBColor := TColorToFPColor(FStateEx.ParentRGBColor);
if Color = clDefault then FStateEx.RGBColor := FDrawer.GetControlDefaultColor(GetControlId()) if Color = clDefault then FStateEx.RGBColor := FDrawer.GetControlDefaultColor(GetControlId())
else FStateEx.RGBColor := GetRGBColorResolvingParent; else FStateEx.RGBColor := GetRGBColorResolvingParent;
FStateEx.FPRGBColor := TColorToFPColor(FStateEx.RGBColor);
FStateEx.Caption := Caption; FStateEx.Caption := Caption;
FStateEx.Font := Font; FStateEx.Font := Font;

View File

@ -5,7 +5,7 @@ unit customdrawndrawers;
interface interface
uses uses
Classes, SysUtils, Types, fpcanvas, Classes, SysUtils, Types, fpcanvas, fpimage,
// LCL for types // LCL for types
Controls, Graphics, ComCtrls, ExtCtrls; Controls, Graphics, ComCtrls, ExtCtrls;
@ -129,7 +129,9 @@ type
TCDControlStateEx = class TCDControlStateEx = class
public public
ParentRGBColor: TColor; ParentRGBColor: TColor;
FPParentRGBColor: TFPColor;
RGBColor: TColor; RGBColor: TColor;
FPRGBColor: TFPColor;
Caption: string; Caption: string;
Font: TFont; // Just a reference, never Free Font: TFont; // Just a reference, never Free
AutoSize: Boolean; AutoSize: Boolean;
@ -312,7 +314,7 @@ type
procedure DrawControl(ADest: TCanvas; ASize: TSize; procedure DrawControl(ADest: TCanvas; ASize: TSize;
AState: TCDControlState; AStateEx: TCDControlStateEx); virtual; abstract; AState: TCDControlState; AStateEx: TCDControlStateEx); virtual; abstract;
// TCDButton // TCDButton
procedure DrawButton(ADest: TCanvas; ASize: TSize; procedure DrawButton(ADest: TFPCustomCanvas; ASize: TSize;
AState: TCDControlState; AStateEx: TCDButtonStateEx); virtual; abstract; AState: TCDControlState; AStateEx: TCDButtonStateEx); virtual; abstract;
// TCDEdit // TCDEdit
procedure DrawEditBackground(ADest: TCanvas; ADestPos: TPoint; ASize: TSize; procedure DrawEditBackground(ADest: TCanvas; ADestPos: TPoint; ASize: TSize;

View File

@ -1146,6 +1146,8 @@ function TCDWidgetSet.DrawFrameControl(DC: HDC; const Rect: TRect; uType,
var var
LazDC: TLazCanvas absolute DC; LazDC: TLazCanvas absolute DC;
lControlStateEx: TCDControlStateEx; lControlStateEx: TCDControlStateEx;
lState: TCDControlState;
lSize: TSize;
begin begin
Result := False; Result := False;
@ -1160,44 +1162,50 @@ begin
case uType of case uType of
DFC_BUTTON: DFC_BUTTON:
begin begin
lSize := Types.Size(Rect.Right-Rect.Left, Rect.Bottom-Rect.Top);
if (DFCS_BUTTONPUSH and uState) <> 0 then
lControlStateEx := TCDButtonStateEx.Create
else
lControlStateEx := TCDControlStateEx.Create; lControlStateEx := TCDControlStateEx.Create;
try try
lControlStateEx.Font := TFont.Create; lControlStateEx.Font := TFont.Create;
{if uState and DFCS_FLAT <> 0 then lControlStateEx.ParentRGBColor := clSilver;
Features := QStyleOptionButtonFlat lControlStateEx.FPParentRGBColor := colSilver;
else lControlStateEx.RGBColor := GetDefaultDrawer().FallbackPalette.BtnFace;
Features := QStyleOptionButtonNone; lControlStateEx.FPRGBColor := TColorToFPColor(lControlStateEx.RGBColor);
if (uState and $1F) in [DFCS_BUTTONCHECK, DFCS_BUTTON3STATE] then
Element := QStyleCE_CheckBox
else
if (DFCS_BUTTONRADIO and uState) <> 0 then
Element := QStyleCE_RadioButton
else
if (DFCS_BUTTONPUSH and uState) <> 0 then
Element := QStyleCE_PushButton
else
if (DFCS_BUTTONRADIOIMAGE and uState) <> 0 then
Element := QStyleCE_RadioButton
//TODO: what to implement here ?
else
if (DFCS_BUTTONRADIOMASK and uState) <> 0 then
Element := QStyleCE_RadioButton
//TODO: what to implement here ?
;}
{Opt := QStyleOptionButton_create();
QStyleOptionButton_setFeatures(Opt, Features);
QStyleOption_setRect(Opt, @Rect);
QStyleOption_setState(Opt, State);
QStyle_drawControl(QApplication_style(), Element, Opt, Painter, Widget);
QStyleOptionButton_destroy(Opt);}
//GetDefaultDrawer().DrawButton(); //if uState and DFCS_FLAT <> 0 then lState := [csfEnabled];
if uState and DFCS_INACTIVE = 0 then lState := lState + [csfEnabled];
if uState and DFCS_PUSHED <> 0 then lState := lState + [csfSunken];
if (uState and $1F) in [DFCS_BUTTONCHECK, DFCS_BUTTON3STATE] then
begin
//Element := QStyleCE_CheckBox
end
else if (DFCS_BUTTONRADIO and uState) <> 0 then
begin
//Element := QStyleCE_RadioButton
end
else if (DFCS_BUTTONPUSH and uState) <> 0 then
begin
GetDefaultDrawer().DrawButton(LazDC, lSize, lState, TCDButtonStateEx(lControlStateEx));
end
else if (DFCS_BUTTONRADIOIMAGE and uState) <> 0 then
begin
//Element := QStyleCE_RadioButton
//TODO: what to implement here ?
end
else if (DFCS_BUTTONRADIOMASK and uState) <> 0 then
begin
//Element := QStyleCE_RadioButton
//TODO: what to implement here ?
end;
finally finally
lControlStateEx.Font.Free; lControlStateEx.Font.Free;
lControlStateEx.Free; lControlStateEx.Free;
end; end;
begin
end;
end; end;
DFC_CAPTION: ; // title bar captions DFC_CAPTION: ; // title bar captions
DFC_MENU: ; // menu DFC_MENU: ; // menu