动画拖放自定义 Delphi 组件

Animated drag and drop custom Delphi component

当您在 Windows 资源管理器中拖动列标题以对其重新排序时(或在 Chrome 中拖动选项卡),您会看到一个漂亮的动画,其中其他 header 按钮四处移动以使 space.

我正在尝试在我正在编写的 header 控件中复制它。 header 按钮不是单独的控件,因此我有一个控件,我在该控件上进行命中测试以确定正在单击哪个按钮。除了一些会引入大量闪烁的策略外,我不太确定如何制作这些动画。

尝试使用您自己的绘画缓冲区(如果 DoubleBuffered 不够好):

  1. 创建缓冲区(TCanvas 或 HDC)
  2. 将控件绘制到此缓冲区 (OnAnimationTimer and/or OnChange)
  3. TMyControl.Paint: 将缓冲区复制到目标 canvas
  4. [您不仅可以将此缓冲区用于动画]
  5. 注意 GDI 对象的数量

像这样:

type  
  TMyControl = class(TWinControl)  
  private  
    FAnimationBuffer: TBitmap;  
    FTimer: Cardinal;  
    procedure OnTimer(var Message: TMessage); message WM_TIMER;  
  protected  
    procedure Paint; override;  
    procedure Animate(columnA, columnB: Integer; frames: Byte);  
  end;  

procedure TMyControl.OnTimer(var Message: TMessage);  
begin  

  //todo : paint control state to FAnimationBuffer  

  if Visible then  
    Invalidate;  
end;  

procedure TMyControl.Paint;  
begin  
  Canvas.Draw(0,0,FAnimationBuffer);  
end;  

procedure TMyControl.Animate;  
begin  
  FTimer := SetTimer(Handle, 1, 100, nil);  
end;