web-dev-qa-db-ja.com

Windowsフォーム(c#)でアニメーションGIFを表示する方法

かなり長いプロセスの実行中に進捗メッセージを表示するフォームがあります。これはWebサービスの呼び出しであるため、進行状況バーに完全な割合の数字を有意義に表示することはできません。 (プログレスバーのマーキープロパティは特に好きではありません)

アニメーションGIFを表示して、プロセスに何らかのアクティビティ(Windowsコピープロセスなど、あるコンピューターから別のコンピューターに移動するファイル)の感覚を与えたいと思います。

これどうやってやるの?

134
Stuart Helwig

難しくありません。

  1. 画像ボックスをフォームにドロップします。
  2. .gifファイルを画像として画像ボックスに追加します
  3. ロード中にピクチャボックスを表示します。

考慮すべき事項:

  • Pictureboxを無効にすると、gifがアニメーション化されなくなります。

アニメーションGIF:

アニメーションgifを探している場合は、それらを生成できます here

別の方法:

私が見つけたもう1つの方法は非常にうまく機能し、非同期ダイアログコントロールが コードプロジェクト

232
FryHard

同じ問題がありました。バックグラウンドでの長時間の操作により、フォーム全体(gifを含む)が再描画を停止します。ここに私がこれを解決した方法があります。

  private void MyThreadRoutine()
  {
   this.Invoke(this.ShowProgressGifDelegate);
   //your long running process
   System.Threading.Thread.Sleep(5000);
   this.Invoke(this.HideProgressGifDelegate);
  }

  private void button1_Click(object sender, EventArgs e)
  {
   ThreadStart myThreadStart = new ThreadStart(MyThreadRoutine);
   Thread myThread = new Thread(myThreadStart);
   myThread.Start(); 
  }

この操作を担当する別のスレッドを作成しました。この初期フォームのおかげで、問題なく再描画を続けています(私のgifの動作を含む)。 ShowProgressGifDelegateおよびHideProgressGifDelegateは、gifを含むpictureBoxの表示プロパティをtrue/falseに設定するフォームのデリゲートです。

11
Aruch

Windowsでは、伝統的にアニメーション化されたGifは使用せず、小さなAVIアニメーションを使用することに注意してください。それらを表示するためのWindowsネイティブコントロールがあります。アニメーション化されたGifをAVI(およびその逆)に変換するツールもあります。

6
PhiLho

PictureBoxコントロールに配置すると、正常に機能するはずです。

3
Grank

あなたが同じスレッドにいるのですべてが停止するので、あなたが後ろで長い操作を開始するときはそうではありません。

1
Marc

私は同じ問題を抱えており、いくつかの異なる問題に直面していた実装により異なるソリューションに遭遇しました。最後に、期待通りに機能するさまざまな投稿の一部をまとめたものを以下に示します。

private void btnCompare_Click(object sender, EventArgs e)
{
    ThreadStart threadStart = new ThreadStart(Execution);
    Thread thread = new Thread(threadStart);
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

PictureBoxコントロールの呼び出しも実行するExecutionメソッドは次のとおりです。

private void Execution()
{
    btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = true; });
    Application.DoEvents();

    // Your main code comes here . . .

    btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = false; });
}

PictureBoxは[プロパティ]ウィンドウから非表示になるか、以下を実行することに注意してください。

private void ComparerForm_Load(object sender, EventArgs e)
{
    pictureBox1.Visible = false;
}
0
M. Fawad Surosh