gpt4 book ai didi

delphi - 使用VCL样式TProgressBar.Style := pbstMarquee does not work

转载 作者:行者123 更新时间:2023-12-03 14:51:06 25 4
gpt4 key购买 nike

当我在带有 VCL 样式的进度条控件上使用 pbstMarquee 时,选取框动画不起作用。

重现步骤:

  1. 文件 > 新建 > VCL 应用程序
  2. TProgressBar 放在主窗体上 > TProgressBar.Style := pbstMarquee
  3. 项目选项 > 外观 > 设置自定义样式 > 设置默认样式
  4. Ctrl + F9

如何解决这个问题并用VCL样式显示动画?

最佳答案

此功能未在 TProgressBarStyleHook 中实现。不幸的是,Windows 不会向进度条控件发送任何消息来指示当处于 marquee mode 时进度条的位置是否发生变化。 ,因此您必须自己实现一种机制来模仿 PBS_MARQUEE 样式,这可以轻松地创建一个新样式 Hook 并使用 TTimer 来完成。样式 Hook 内部。

检查 Style hook 的基本实现

uses
Vcl.Styles,
Vcl.Themes,
Winapi.CommCtrl;

{$R *.dfm}

type
TProgressBarStyleHookMarquee=class(TProgressBarStyleHook)
private
Timer : TTimer;
FStep : Integer;
procedure TimerAction(Sender: TObject);
protected
procedure PaintBar(Canvas: TCanvas); override;
public
constructor Create(AControl: TWinControl); override;
destructor Destroy; override;
end;


constructor TProgressBarStyleHookMarquee.Create(AControl: TWinControl);
begin
inherited;
FStep:=0;
Timer := TTimer.Create(nil);
Timer.Interval := 100;//TProgressBar(Control).MarqueeInterval;
Timer.OnTimer := TimerAction;
Timer.Enabled := TProgressBar(Control).Style=pbstMarquee;
end;

destructor TProgressBarStyleHookMarquee.Destroy;
begin
Timer.Free;
inherited;
end;

procedure TProgressBarStyleHookMarquee.PaintBar(Canvas: TCanvas);
var
FillR, R: TRect;
W, Pos: Integer;
Details: TThemedElementDetails;
begin
if (TProgressBar(Control).Style=pbstMarquee) and StyleServices.Available then
begin
R := BarRect;
InflateRect(R, -1, -1);
if Orientation = pbHorizontal then
W := R.Width
else
W := R.Height;

Pos := Round(W * 0.1);
FillR := R;
if Orientation = pbHorizontal then
begin
FillR.Right := FillR.Left + Pos;
Details := StyleServices.GetElementDetails(tpChunk);
end
else
begin
FillR.Top := FillR.Bottom - Pos;
Details := StyleServices.GetElementDetails(tpChunkVert);
end;

FillR.SetLocation(FStep*FillR.Width, FillR.Top);
StyleServices.DrawElement(Canvas.Handle, Details, FillR);
Inc(FStep,1);
if FStep mod 10=0 then
FStep:=0;
end
else
inherited;
end;

procedure TProgressBarStyleHookMarquee.TimerAction(Sender: TObject);
var
Canvas: TCanvas;
begin
if StyleServices.Available and (TProgressBar(Control).Style=pbstMarquee) and Control.Visible then
begin
Canvas := TCanvas.Create;
try
Canvas.Handle := GetWindowDC(Control.Handle);
PaintFrame(Canvas);
PaintBar(Canvas);
finally
ReleaseDC(Handle, Canvas.Handle);
Canvas.Handle := 0;
Canvas.Free;
end;
end
else
Timer.Enabled := False;
end;

initialization

TStyleManager.Engine.RegisterStyleHook(TProgressBar, TProgressBarStyleHookMarquee);

end.

您可以查看此风格钩子(Hook)的演示 here

关于delphi - 使用VCL样式TProgressBar.Style := pbstMarquee does not work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9861136/

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