2009-05-05 100 views
7

我對一些簡單的動畫使用OnIdle事件,它工作正常。 但是,麻煩在於,當用戶開始移動窗口或調整窗口大小時,OnIdle事件停止發射,直到移動/調整大小操作完成。德爾福:檢測窗口移動的開始和結束

我需要檢測何時發生這種情況,以便我可以暫停所有動畫。但是,如何檢測窗戶的移動?

+5

使用的OnIdle是不是真的是一個好主意,因爲它會導致在活動芯100%CPU的負載。使用一個定時器事件,它有兩個好處:它也會在第二個消息循環中觸發,所以動畫在移動/調整大小期間繼續(當全窗口拖動被激活時它應該);而且無論系統速度如何,您都可以每秒設置一個合理的動畫步數。 – mghie 2009-05-06 04:33:00

+0

計時器與閒置是一個有趣的話題。兩者都有優點和缺點,但對於我的小裝飾動畫,onidle會做得很好。 – Vegar 2009-05-06 11:09:26

回答

8

我與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;