Custom paint method in TSplitter does not use Vcl Styles colors
I am using the code posted in this link TSplitter enhanced with grab bar
to draw the capture in the splitter control box,
procedure TSplitter.Paint;
var
R: TRect;
X, Y: integer;
DX, DY: integer;
i: integer;
Brush: TBitmap;
begin
R := ClientRect;
Canvas.Brush.Color := Color;
Canvas.FillRect(ClientRect);
X := (R.Left+R.Right) div 2;
Y := (R.Top+R.Bottom) div 2;
if (Align in [alLeft, alRight]) then
begin
DX := 0;
DY := 3;
end else
begin
DX := 3;
DY := 0;
end;
dec(X, DX*2);
dec(Y, DY*2);
Brush := TBitmap.Create;
try
Brush.SetSize(2, 2);
Brush.Canvas.Brush.Color := clBtnHighlight;
Brush.Canvas.FillRect(Rect(0,0,1,1));
Brush.Canvas.Pixels[0, 0] := clBtnShadow;
for i := 0 to 4 do
begin
Canvas.Draw(X, Y, Brush);
inc(X, DX);
inc(Y, DY);
end;
finally
Brush.Free;
end;
end;
the code works well, but when I included the vcl styles, the colors used to draw the splitter and gripper do not match the vcl styles used.
How can I draw TSplitter using VCL style colors for the current theme?
+3
source to share
1 answer
system color constants that use code (clBtnFace, clBtnHighlight, clBtnShadow) do not preserve vcl style colors, you must use StyleServices.GetSystemColor
to translate them to vcl style colors.
procedure TSplitter.Paint;
var
R: TRect;
X, Y: integer;
DX, DY: integer;
i: integer;
Brush: TBitmap;
begin
R := ClientRect;
if TStyleManager.IsCustomStyleActive then
Canvas.Brush.Color := StyleServices.GetSystemColor(clBtnFace)
else
Canvas.Brush.Color := Color;
Canvas.FillRect(ClientRect);
X := (R.Left+R.Right) div 2;
Y := (R.Top+R.Bottom) div 2;
if (Align in [alLeft, alRight]) then
begin
DX := 0;
DY := 3;
end else
begin
DX := 3;
DY := 0;
end;
dec(X, DX*2);
dec(Y, DY*2);
Brush := TBitmap.Create;
try
Brush.SetSize(2, 2);
if TStyleManager.IsCustomStyleActive then
Brush.Canvas.Brush.Color := StyleServices.GetSystemColor(clBtnHighlight)
else
Brush.Canvas.Brush.Color := clBtnHighlight;
Brush.Canvas.FillRect(Rect(0, 0, Brush.Height, Brush.Width));
if TStyleManager.IsCustomStyleActive then
Brush.Canvas.Pixels[0, 0] := StyleServices.GetSystemColor(clBtnShadow)
else
Brush.Canvas.Pixels[0, 0] := clBtnShadow;
for i := 0 to 4 do
begin
Canvas.Draw(X, Y, Brush);
inc(X, DX);
inc(Y, DY);
end;
finally
Brush.Free;
end;
end;
+4
source to share