24

WinForm 上のオブジェクトをアニメーション化するとします。タイマーを設定して状態またはモデルを更新し、フォームのペイント イベントをオーバーライドします。しかし、そこからアニメーション用に Form を継続的に再描画するにはどうすればよいでしょうか?

  • 描画が終了したらすぐにフォームを無効にしますか?
  • 2 番目のタイマーを設定し、定期的にフォームを無効にしますか?
  • これには共通のパターンがあるのではないでしょうか?
  • 役に立つ .NET クラスはありますか?

これを行う必要があるたびに、新しい欠点を伴う新しい方法を発見します。SO コミュニティからの経験と推奨事項は何ですか?

4

3 に答える 3

52

これに役立つ可能性のあるライブラリを作成しました。これはトランジションと呼ばれ、https ://github.com/UweKeim/dot-net-transitionsにあります。dot-net-transitionsパッケージとしてnugetで利用可能

バックグラウンドスレッドで実行されているタイマーを使用して、オブジェクトをアニメーション化します。ライブラリはオープンソースであるため、使用する場合は、コードを調べて、ライブラリが何をしているのかを確認できます。

于 2009-07-20T21:10:10.663 に答える
9

場合によっては、paint イベントを使用して描画するのではなく、コントロール/フォームから Graphics オブジェクトを取得し、その上に描画する方が高速で便利な場合があります。これにより、不透明度/アンチエイリアシング/テキストなどで問題が発生する可能性がありますが、シャバン全体を再描画する必要がないという点で、問題を起こす価値はあります。次のようなもの:

private void AnimationTimer_Tick(object sender, EventArgs args)
{
    // First paint background, like Clear(Control.Background), or by
    // painting an image you have previously buffered that was the background.
    animationControl.CreateGraphics().DrawImage(0, 0, animationImages[animationTick++])); 
}

私はこれを自分でいくつかのコントロールで使用し、対象のオブジェクトが移動したり削除する必要がある場合に、背景を「クリア」するために画像をバッファリングしました。

于 2008-08-14T17:39:43.307 に答える
4

あなたがしていることは、私がこれまでに WinForms で使用した唯一のソリューションです (一定の再描画を行うタイマー)。ユーザーのエクスペリエンスをよりスムーズにするために使用できるテクニックがたくさんあります (ダブルバッファリングなど)。

WPF を試してみることをお勧めします。WPF にはアニメーションを実行するための機能が組み込まれており、タイマー ベースのソリューションよりもはるかにスムーズです (コードが少なくて済み、同期も必要ありません)。

そのソリューションでは、アプリ全体で WPF を使用する必要はないことに注意してください。この機能を WPF コントロールにパックし、そのコントロールを WinForms アプリケーション (またはアンマネージド アプリ) に埋め込むことができます。

http://www.codeproject.com/KB/WPF/WPF_UserControls.aspx

于 2008-08-14T16:50:10.753 に答える