いくつかの単純なアニメーションではOnIdleイベントを使用していますが、正常に動作します。 しかし、問題は、ユーザーがウィンドウの移動またはサイズ変更を開始したときに、OnIdleイベントが、移動/サイズ変更操作が完了するまで、起動を停止することです。Delphi:ウィンドウ移動の開始と終了の検出
これがいつ発生するのかを検出する必要があるため、すべてのアニメーションを一時停止できます。しかし、どのようにしてウィンドウの動きを検出できますか?
いくつかの単純なアニメーションではOnIdleイベントを使用していますが、正常に動作します。 しかし、問題は、ユーザーがウィンドウの移動またはサイズ変更を開始したときに、OnIdleイベントが、移動/サイズ変更操作が完了するまで、起動を停止することです。Delphi:ウィンドウ移動の開始と終了の検出
これがいつ発生するのかを検出する必要があるため、すべてのアニメーションを一時停止できます。しかし、どのようにしてウィンドウの動きを検出できますか?
私は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;
私はこれを試したことはありませんが、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を使用すると、本当に良いアイデアではありません。代わりに、2つ目のメッセージループでも起動するため、移動/サイズ変更中にアニメーションが続行されます(フルウィンドウのドラッグが有効な場合)。システムの速度に関係なく、1秒あたりの賢明なアニメーションステップ数を設定できます。 – mghie
タイマー対アイドルは興味深いトピックです。両方とも長所と短所がありますが、私の小さな装飾的なアニメーションでは、大丈夫です。 – Vegar
このような「小さな装飾アニメーション」は、$ユーザーがそれらを無効にできない場合、ラップトップで多くのバッテリー時間を要します。また、あなたは積極的に他のアプリケーションからCPUサイクルを盗んでいます。現実には、OnIdleは短所しか持っていません。 – mghie