2009-04-28 21 views
4

アニメーションGIFをTabPageのタブイメージとして表示したいと思います。ImageList/TabPageのアニメーションGIF

私はImageListに私の画像を追加し、TabPage.ImageIndexプロパティを使用している場合、それは最初のフレームのみを示し(およびアニメーションはありません):

ImageList imageList = new ImageList(); 
imageList.Images.Add(Properties.Resources.my_animated_gif); 

tabControl.ImageList = imageList; 
tabPage.ImageIndex = 0; 

ネット上のいくつかのフォーラムはまた、「ImageList doesnの示唆アニメーションGIFをサポートしています。

アニメーションGIFをTabPageの画像として簡単に表示する方法はありますか?所有者がイメージを描き、アニメートする必要がありますか?

答えて

1

これは遅い回答ですが、うまくいけば誰かがそれから恩恵を受けるでしょう、以下は私がTabPageで画像をアニメートするために行ったことです、アニメーション化されたローディングアイコンを表示するために使用しました。それらをリソースに含めました。

using System; 
using System.Windows.Forms; 
using System.Drawing; 
using System.Threading; 
namespace GuiLib 
{ 

public class AnimatedTabControl : TabControl 
{ 

    static int ITEM_WIDTH = 250; 
    static int ITEM_HEIGHT = 25; 
    static int TIMER_INTERVAL = 80; 

    static int ICON_X = 3; 
    static int ICON_Y = 3; 
    static int ICON_WIDTH = 15; 
    static int ICON_HIGHT = 15; 

    static int TEXT_X = 50; 
    static int TEXT_Y = 6; 
    static int TEXT_WIDTH = 200; 
    static int TEXT_HIGHT = 15; 

    int animationIndex; 
    static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer(); 

    Bitmap[] animationImages = {new Bitmap(GuiLib.Properties.Resources._0), new Bitmap(GuiLib.Properties.Resources._1),new Bitmap(GuiLib.Properties.Resources._2), 
           new Bitmap(GuiLib.Properties.Resources._3),new Bitmap(GuiLib.Properties.Resources._4),new Bitmap(GuiLib.Properties.Resources._5), 
           new Bitmap(GuiLib.Properties.Resources._6),new Bitmap(GuiLib.Properties.Resources._7)}; 
    Bitmap animatedimage; 

    public AnimatedTabControl() 
     : base() 
    {    
     this.DrawMode = TabDrawMode.OwnerDrawFixed; 
     this.SizeMode = TabSizeMode.Fixed; 
     this.ItemSize = new Size(ITEM_WIDTH, ITEM_HEIGHT); 
     myTimer.Tick += new EventHandler(TimerEventProcessor); 
     myTimer.Interval = TIMER_INTERVAL; 
     animationIndex = 0; 
    } 

    private void TimerEventProcessor(Object myObject, EventArgs myEventArgs) 
    { 
     animationIndex++; 

     if (animationIndex >= animationImages.Length) 
      animationIndex = 0; 

     animatedimage = animationImages[animationIndex]; 
     AnimateLoadingTabsOrStopIfNonIsLoading(); 
    } 

    private void AnimateLoadingTabsOrStopIfNonIsLoading() 
    { 
     bool stopRunning = true; 
     for (int i = 0; i < this.TabPages.Count; i++) 
     { 
      if (this.TabPages[i] is LoadingTabPage) 
      { 
       LoadingTabPage ltp = (LoadingTabPage)this.TabPages[i]; 

       if (ltp.Loading) 
       { 
        stopRunning = false; 
        Rectangle r = GetTabRect(i); 
        this.Invalidate(new Rectangle(r.X + ICON_X, r.Y + ICON_Y, ICON_WIDTH, ICON_HIGHT)); 
       } 
      } 
     } 

     if (stopRunning) 
      myTimer.Stop(); 
    } 

    protected override void OnDrawItem(DrawItemEventArgs e) 
    { 
     Rectangle r = e.Bounds; 
     r = GetTabRect(e.Index); 

     DrawAnimationImageIfLoading(e, r); 
     DrawTabTitle(e, r); 
    } 

    private void DrawTabTitle(DrawItemEventArgs e, Rectangle r) 
    { 
     string title = this.TabPages[e.Index].Text; 
     StringFormat titleFormat = new StringFormat(); 
     titleFormat.Trimming = StringTrimming.EllipsisCharacter; 
     e.Graphics.DrawString(title, this.Font, Brushes.Black, new RectangleF(r.X + TEXT_X, r.Y + TEXT_Y, TEXT_WIDTH, TEXT_HIGHT), titleFormat); 
    } 

    private void DrawAnimationImageIfLoading(DrawItemEventArgs e, Rectangle r) 
    { 
     if (this.TabPages[e.Index] is LoadingTabPage) 
     { 
      if (((LoadingTabPage)this.TabPages[e.Index]).Loading) 
      { 
       if (animatedimage != null) 
        e.Graphics.DrawImage(animatedimage, new RectangleF(r.X + ICON_X, r.Y + ICON_Y, ICON_WIDTH, ICON_HIGHT)); 

       if (!myTimer.Enabled) 
        myTimer.Start(); 
      } 
     } 
    }  
} 
} 

そして、このようLoadingTabPage

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace GuiLib 
{ 
/// <summary> 
/// A Class to facilitate tab page with animated loading icon. 
/// </summary> 
public class LoadingTabPage : TabPage 
{ 
    public LoadingTabPage(string s) 
     : base(s) 
    { 
     loading = false; 
    } 

    public LoadingTabPage() 
     : base() 
    { 
     loading = false; 
    } 

    private bool loading; 

    public bool Loading 
    { 
     get { return loading; } 
     set 
     { 
      loading = value; 
      if (this.Parent != null) 
      { 
       this.Parent.Invalidate(); 
      } 
     } 
    } 

} 

} 

使い方は簡単になります:私が思ったよう

myLoadingTabPage.Loading = true; 
+0

は、唯一の解決策は、オーナー描画にあります。しかし、参照コードを取得することは良いことであり、将来誰かを助けることを願っています。 –

1

アイコンをプログラムでループで更新する(また、天気をチェックして停止する)バックグラウンドワーカーを使用することをお勧めします(フリーソリューション)。ちょっと複雑ですが、あなたはそのアイデアが正しいと思いますか? = P

0

DevexpressはImageCollectionと非常によく似ており、GIFをサポートしています。

関連する問題