我对一些简单的动画使用OnIdle事件,它工作正常。 但是,麻烦在于,当用户开始移动窗口或调整窗口大小时,OnIdle事件停止发射,直到移动/调整大小操作完成。德尔福:检测窗口移动的开始和结束
我需要检测何时发生这种情况,以便我可以暂停所有动画。但是,如何检测窗户的移动?
我对一些简单的动画使用OnIdle事件,它工作正常。 但是,麻烦在于,当用户开始移动窗口或调整窗口大小时,OnIdle事件停止发射,直到移动/调整大小操作完成。德尔福:检测窗口移动的开始和结束
我需要检测何时发生这种情况,以便我可以暂停所有动画。但是,如何检测窗户的移动?
我与mghie评论去:使用计时器的动画,并激活/使用消息处理程序停用。
在你的情况,你可能需要添加下面的消息处理程序:
//fired when starting/ending a "move" or "size" window
procedure WMEnterSizeMove(var Message: TMessage) ; message WM_ENTERSIZEMOVE;
procedure WMExitSizeMove(var Message: TMessage) ; message WM_EXITSIZEMOVE;
procedure TForm.WMEnterSizeMove(var msg: TMessage);
begin
AnimationTimer.Enabled := false;
inherited;
end;
procedure TForm.WMExitSizeMove(var msg: TMessage);
begin
AnimationTimer.Enabled := true;
inherited;
end;
我还没有试过这个,但我会说你可以使用WM_WINDOWPOSCHANGING来告诉窗口何时被移动。 http://msdn.microsoft.com/en-us/library/ms632653(VS.85).aspx
Delphi代码将是:
TSomeForm = class(TForm)
protected
...
procedure WindowPosChanging(var Msg : TMessage); message WM_WINDOWPOSCHANGING;
...
end;
使用的OnIdle是不是真的是一个好主意,因为它会导致在活动芯100%CPU的负载。使用一个定时器事件,它有两个好处:它也会在第二个消息循环中触发,所以动画在移动/调整大小期间继续(当全窗口拖动被激活时它应该);而且无论系统速度如何,您都可以每秒设置一个合理的动画步数。 – mghie 2009-05-06 04:33:00
计时器与闲置是一个有趣的话题。两者都有优点和缺点,但对于我的小装饰动画,onidle会做得很好。 – Vegar 2009-05-06 11:09:26