2011-07-19 22 views
0

C#4.0で書かれたWinformsアプリケーションにカスタムButtonクラスがあります。ボタンは静的な画像を通常保持しますが、リフレッシュ操作が行われると、アニメーション化されたAJAXスタイルのボタンに切り替わります。画像をアニメートするために、タイマーを設定して、毎回ティックごとに画像アニメーションを進め、それをボタン画像として設定します。それが私にそれを働かせる唯一の方法です。私が持っている解決法は効率的ではありません。アドバイスが参考になります。winformsボタンでアニメーション画像と静止画像を切り替える

2つの質問 1.簡単な方法がありますか?私は使用するべき機能を見落としていますか? 2.画像を手動でアニメーションするより良い方法はありますか?

以下のコードは、私が各ティックで何をしているのかを見つけます。改善の最初の領域:多分イメージの各フレームをリストにコピーしますか? _image.Dispose()に注意してください。ローカルImageを破棄してメモリリークを引き起こしていました。

こちらのアドバイスをいただきありがとうございます。効率的なソリューションがあれば、私は何かをオンラインで投稿してリンクします。

private void TickImage() 
    { 
     if (!_stop) 
     { 
      _ticks++; 

      this.SuspendLayout(); 

      Image = null; 

      if(_image != null) 
       _image.Dispose(); 

      //Get the animated image from resources and the info 
      //required to grab a frame 
      _image = Resources.Progress16; 
      var dimension = new FrameDimension(_image.FrameDimensionsList[0]); 
      int frameCount = _image.GetFrameCount(dimension); 

      //Reset to zero if we're at the end of the image frames 
      if (_activeFrame >= frameCount) 
      { 
       _activeFrame = 0; 
      } 

      //Select the frame of the animated image we want to show 
      _image.SelectActiveFrame(dimension, _activeFrame); 

      //Assign our frame to the Image property of the button 
      Image = _image; 

      this.ResumeLayout(); 

      _activeFrame++; 

      _ticks--; 
     } 
    } 

答えて

2
  1. 私はWinformsのはそう、独自のアニメーション機能に達していないと思います。より高度なアニメーションを使用したい場合は、サードパーティのソリューションを検討してください。
  2. 私はあなたが毎週ティックごとにリソースから画像を読み込むべきではないと思います。より良い方法は、イメージフレームをプリロードして参照を保持することです。その後、それを使用して、毎回適切なフレームを設定します。

私が最近テストしたように、アニメーション化されたgifは、少なくとも標準的なボタンでは、追加のコーディングなしでうまくアニメーション化されています。しかし、あなたはまだ手動でフレームをアミノ化する必要がある場合、あなたはこのような何かしてみてください可能性があります

// put this somewhere in initialization 
private void Init() 
{ 
    Image image = Resources.Progress16; 
    _dimension = new FrameDimension(image.FrameDimensionsList[0]); 
    _frameCount = image.GetFrameCount(_dimension); 
    image.SelectActiveFrame(_dimension, _activeFrame); 
    Image = image; 
} 

private void TickImage() 
{ 
    if (_stop) return; 
    // get next frame index 
    if (++_activeFrame >= _frameCount) 
    { 
     _activeFrame = 0; 
    } 
    // switch image frame 
    Image.SelectActiveFrame(_dimension, _activeFrame); 
    // force refresh (NOTE: check if it's really needed) 
    Invalidate(); 
} 

を別のオプションを使用すると、上記のSelectActiveFrameでそれを行うと同じようにプリロードされた静止フレームとサイクルImageIndex properyとImageListプロパティを使用することです。

+0

イメージフレームをリストに読み込む方法を教えてください。私は、それが私が持っている主要なパフォーマンスの問題を解決するだろうと思う。ご回答有難うございます。 –

+0

私の答えは –

+0

Sweetです。もちろん、今は本当に明らかにそうです。ご協力いただきありがとうございます。 –

関連する問題