动画拖放自定义 Delphi 组件
Animated drag and drop custom Delphi component
当您在 Windows 资源管理器中拖动列标题以对其重新排序时(或在 Chrome 中拖动选项卡),您会看到一个漂亮的动画,其中其他 header 按钮四处移动以使 space.
我正在尝试在我正在编写的 header 控件中复制它。 header 按钮不是单独的控件,因此我有一个控件,我在该控件上进行命中测试以确定正在单击哪个按钮。除了一些会引入大量闪烁的策略外,我不太确定如何制作这些动画。
尝试使用您自己的绘画缓冲区(如果 DoubleBuffered 不够好):
- 创建缓冲区(TCanvas 或 HDC)
- 将控件绘制到此缓冲区 (OnAnimationTimer and/or OnChange)
TMyControl.Paint
: 将缓冲区复制到目标 canvas
- [您不仅可以将此缓冲区用于动画]
- 注意 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;
当您在 Windows 资源管理器中拖动列标题以对其重新排序时(或在 Chrome 中拖动选项卡),您会看到一个漂亮的动画,其中其他 header 按钮四处移动以使 space.
我正在尝试在我正在编写的 header 控件中复制它。 header 按钮不是单独的控件,因此我有一个控件,我在该控件上进行命中测试以确定正在单击哪个按钮。除了一些会引入大量闪烁的策略外,我不太确定如何制作这些动画。
尝试使用您自己的绘画缓冲区(如果 DoubleBuffered 不够好):
- 创建缓冲区(TCanvas 或 HDC)
- 将控件绘制到此缓冲区 (OnAnimationTimer and/or OnChange)
TMyControl.Paint
: 将缓冲区复制到目标 canvas- [您不仅可以将此缓冲区用于动画]
- 注意 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;