我對一些簡單的動畫使用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