gpt4 book ai didi

delphi - TSplitter 中的自定义绘制方法不使用 Vcl 样式颜色

转载 作者:行者123 更新时间:2023-12-03 15:52:54 33 4
gpt4 key购买 nike

我正在使用此链接 TSplitter enhanced with grab bar 中发布的代码,在分割器控件中绘制抓取栏,

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;

代码工作得很好,但是当我启用 vcl 样式时,用于绘制分隔符和抓取栏的颜色不适合 vcl 样式使用的颜色。

enter image description here

如何使用当前主题的 Vcl 风格颜色绘制 TSplitter?

最佳答案

system color constants其中使用的代码(clBtnFace、clBtnHighlight、clBtnShadow)不存储vcl样式颜色,必须使用StyleServices.GetSystemColor函数将这些转换为 vcl 样式颜色。

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;

关于delphi - TSplitter 中的自定义绘制方法不使用 Vcl 样式颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9932668/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com