【问题标题】:how to draw animated level bar in TVirtualStringTree?如何在 TVirtualStringTree 中绘制动画水平条?
【发布时间】:2016-08-02 09:45:16
【问题描述】:

我的目标是在VST中绘制一个自定义动画进度条

我的目标是绘制与下图类似的结果,我尝试做这样的事情OnBeforeCellPaint

procedure TForm2.VTs1BeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
  NewRect : TRect;
  xOff, yOff : Integer;
  ProgressBarRect: TRect;
  Percents: Real;
  DrawProgressBar: Boolean;
begin
  //draw progress
  Percents := 10; // 40%
  // progressBar on Column 3
  begin
  // draw progressbar
    ProgressBarRect.Left := 0;
    ProgressBarRect.Top := CellRect.Top + 1;
    ProgressBarRect.Right := round((CellRect.Right - CellRect.Left) * Percents)  + CellRect.Left;
    ProgressBarRect.Bottom := CellRect.Bottom - 1;
    if (ProgressBarRect.Right - ProgressBarRect.Left) > 0 then
    begin
      TargetCanvas.Brush.Color := RGB(179,255,102);
      TargetCanvas.FillRect(ProgressBarRect);
    end;
  // ProgressBarRect
    inc(ProgressBarRect.Left);
    inc(ProgressBarRect.Top);
    dec(ProgressBarRect.Right);
    dec(ProgressBarRect.Bottom);
    if (ProgressBarRect.Right - ProgressBarRect.Left) > 0 then
    begin
      TargetCanvas.Brush.Color := RGB(221,255,187);
      TargetCanvas.FillRect(ProgressBarRect);
    end;
  end; 
end;

但我无法获得与下图相同的结果并达到相同的方法:

这就是我在编码中得到的结果:

进度条出现在不在它旁边的节点上,它的设计与图像中显示的不同我在上面发布的动画图像的设计。

【问题讨论】:

  • “但是我不能做同样的结果,也不能达到同样的图像处理方法” 为什么不呢?有什么不同,什么不起作用以及以什么方式?
  • 添加了有问题的结果图片
  • 这是在单元格绘制之前,因此实际的单元格绘制可能会覆盖您正在执行的操作。那么,你不需要修改 var ContentRect 吗?
  • 我创建了新的矩形以在节点名称左侧显示进度条,并且设计出来的形状完全不像图像。我正在尝试对动画 gif 图像做同样的结果
  • 但是你的矩形宽度是单元格宽度的百分比。当然应该是百分比单元格高度和固定宽度?

标签: delphi delphi-xe8 virtualtreeview tvirtualstringtree


【解决方案1】:

OnBeforeCellPaint 仅在绘制单元格之前触发一次。

我使用了一个计时器来重新绘制 VST 以“动画化”矩形。

注意Percents 是小数,而不是百分比值,所以100%1

一个非常基本的演示如下:

private
  Percents: Real;

. . .

implementation

procedure TForm2.FormCreate(Sender: TObject);
begin
  Percents := 0;
  VirtualStringTree1.AddChild(nil);
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  if Percents > 1 then
    Percents := 0
  else
    Percents := Percents + 0.025;

  VirtualStringTree1.Repaint;
end;

procedure TForm2.VirtualStringTree1BeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
const
  CPROGBARWIDTH = 30;//rect width
  CPROGBARSTEPS = 6;//how many rect is 100%
var
  r: TRect;
  h, n: Integer;
begin
  if Percents > 1 then
    Percents := 1
  else if Percents = 0 then
    Exit;//nothing to draw

  h := Round(CellRect.Height / CPROGBARSTEPS) - 1;

  r.Top := CellRect.bottom - h - 1;
  r.Left := 1;{align left}
  //r.Left := CellRect.Right - CPROGBARWIDTH - 1;{align right}
  r.Width := CPROGBARWIDTH;

  TargetCanvas.Brush.Color := clSkyBlue;

  n := Ceil(Percents * CPROGBARSTEPS);//how many rect to draw?

  while n > 0 do begin
    r.Height := h;
    TargetCanvas.FillRect(r);
    Dec(r.Top, 1 + h);
    Dec(n);
  end;
end;

八月假期奖励 又名“动画左侧的 100% 非动画矩形

这会绘制类似于问题中的动画 GIF 的内容。

这里使用了嵌套例程。

procedure drawProgress(AWidth: Integer; APercent: Real; ASteps: Integer; ALeft: Integer = 1);

AWidth矩形宽度
APercent进度百分比
ASteps完全100%进度的块数
ALeft左上角点的水平坐标矩形

procedure TForm2.VirtualStringTree1BeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);

  procedure drawProgress(AWidth: Integer; APercent: Real; ASteps: Integer; ALeft: Integer = 1);
  var
    r: TRect;
    h, n: Integer;
  begin
    if APercent > 1 then
      APercent := 1
    else if APercent = 0 then
      Exit;//nothing to draw

    h := Round(CellRect.Height / ASteps) - 1;

    r.Top := CellRect.bottom - h - 1;
    r.Left := ALeft;
    r.Width := AWidth;

    TargetCanvas.Brush.Color := clSkyBlue;

    n := Ceil(APercent * ASteps);//how many rect to draw?

    while n > 0 do begin
      r.Height := h;
      TargetCanvas.FillRect(r);
      Dec(r.Top, 1 + h);
      Dec(n);
    end;
  end;

begin
  drawProgress(10,        1, 7);
  drawProgress(30, Percents, 7, 1 + 10 + 1);
end;

【讨论】:

    【解决方案2】:

    首先,您需要增大单元格(行)的高度。我假设你知道该怎么做。

    接下来,正如我在 cmets 中所说,您使用错误的方向进行计算:

    最后,你没有按你应该的方式除以 100!

    procedure TForm2.VTs1BeforeCellPaint(Sender: TBaseVirtualTree;
      TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
      CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
    var
      NewRect : TRect;
      xOff, yOff : Integer;
      ProgressBarRect: TRect;
      Percents: Real;
      DrawProgressBar: Boolean;
    begin
      //draw progress
      // Percents := 10; // 40% // for testing?
      // progressBar on Column 3
      begin
      // draw progressbar
        ProgressBarRect.Left := 0;
        ProgressBarRect.Top := round((CellRect.Top - CellRect.Bottom) * Percents/100)  + CellRect.Bottom;
        ProgressBarRect.Right := 30;
        ProgressBarRect.Bottom := CellRect.Bottom - 1;
        if (ProgressBarRect.Top - ProgressBarRect.Bottom) > 0 then
        begin
          TargetCanvas.Brush.Color := RGB(179,255,102);
          TargetCanvas.FillRect(ProgressBarRect);
        end;
      // ProgressBarRect
        inc(ProgressBarRect.Left);
        inc(ProgressBarRect.Top);
        dec(ProgressBarRect.Right);
        dec(ProgressBarRect.Bottom);
        if (ProgressBarRect.Top - ProgressBarRect.Bottom) > 0 then
        begin
          TargetCanvas.Brush.Color := RGB(221,255,187);
          TargetCanvas.FillRect(ProgressBarRect);
        end;
      end; 
    end;
    

    编辑注释

    更新删除了将大小固定为 10% 的测试线

    【讨论】:

    • 我以为这只是为了测试。您需要删除 Percents := 10 行。将进行编辑。
    • 你是如何制作动画的?我假设通过计时器刷新?
    • invalidate via timer yes 与下面的答案相同 if Percents > 1 then ` begin Percents := 0; end else begin 百分比 := 百分比 + 0.025;结尾; Vts1.无效;`
    • 我的假设是 % 1-100。您是否从回合计算中删除了 /100?
    • (要按原样使用,您需要百分比 := percents + 25)
    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    相关资源
    最近更新 更多