2009-05-05 12 views
7

いくつかの単純なアニメーションではOnIdleイベントを使用していますが、正常に動作します。 しかし、問題は、ユーザーがウィンドウの移動またはサイズ変更を開始したときに、OnIdleイベントが、移動/サイズ変更操作が完了するまで、起動を停止することです。Delphi:ウィンドウ移動の開始と終了の検出

これがいつ発生するのかを検出する必要があるため、すべてのアニメーションを一時停止できます。しかし、どのようにしてウィンドウの動きを検出できますか?

+5

ONIDLEを使用すると、本当に良いアイデアではありません。代わりに、2つ目のメッセージループでも起動するため、移動/サイズ変更中にアニメーションが続行されます(フルウィンドウのドラッグが有効な場合)。システムの速度に関係なく、1秒あたりの賢明なアニメーションステップ数を設定できます。 – mghie

+0

タイマー対アイドルは興味深いトピックです。両方とも長所と短所がありますが、私の小さな装飾的なアニメーションでは、大丈夫です。 – Vegar

+0

このような「小さな装飾アニメーション」は、$ユーザーがそれらを無効にできない場合、ラップトップで多くのバッテリー時間を要します。また、あなたは積極的に他のアプリケーションからCPUサイクルを盗んでいます。現実には、OnIdleは短所しか持っていません。 – mghie

答えて

8

私はmghieコメントと一緒に行きたい:メッセージハンドラでそれを無効/アニメーションのためのタイマーを使用し、アクティブにします。あなたのケースでは

、次のメッセージハンドラを追加したい場合があります。それは、アクティブコアの上に、100%のCPU負荷を引き起こしますよう

//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; 
+1

私はこれら2つのメッセージを後でチェックアウトします。私は以前彼らについて知りませんでした。ありがとう。 – Vegar

+0

@LeGEC:なぜアニメーションを全く無効にするのですか?移動/サイジングを妨げず、有効になっている場合は完全なウィンドウのドラッグに一致します。 – mghie

4

私はこれを試したことはありませんが、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; 
関連する問題