いくつかの単純なアニメーションに OnIdle イベントを使用していますが、問題なく動作します。ただし、問題は、ユーザーがウィンドウの移動またはサイズ変更を開始したときに、移動/サイズ変更操作が完了するまで OnIdle イベントの発生が停止することです。
すべてのアニメーションを一時停止できるように、これがいつ発生するかを検出する必要があります。しかし、どうすればウィンドウの動きを検出できますか?
mghie comment を使用します。アニメーションにタイマーを使用し、メッセージハンドラーでアクティブ化/非アクティブ化します。
あなたの場合、次のメッセージ ハンドラを追加することをお勧めします。
//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;