动画拖放自定义 Delphi 组件

Posted

技术标签:

【中文标题】动画拖放自定义 Delphi 组件【英文标题】:Animated drag and drop custom Delphi component 【发布时间】:2015-12-06 22:26:56 【问题描述】:

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

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

【问题讨论】:

TChromeTabs 会做这种动画。 【参考方案1】:

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

    创建缓冲区(TCanvas 或 HDC) 将控件绘制到此缓冲区(OnAnimationTimer 和/或 OnChange) TMyControl.Paint:将缓冲区复制到目标画布 [您不仅可以将此缓冲区用于动画] 注意 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;  

【讨论】:

以上是关于动画拖放自定义 Delphi 组件的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11拖放自定义文件?

在 QListWidget 之间拖放自定义小部件项目

WPF拖放自定义类

在 WPF 中的网格中的单元格之间拖放自定义控件

Delphi 中的跨应用程序拖放

Delphi自定义组件如何在属性面板中实现打开文件的对话框?