2009-04-28 78 views
4

我想在TabPage上显示一个动画GIF作为标签图像。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没有按” t支持动画GIF。

有没有一种简单的方法在TabPage上显示动画GIF作为图像?我是否必须自己绘制图像并对其进行动画处理?

回答

1

这是一个迟到的答案,但希望有人会从中受益,下面是我在TabPage中为图像制作动画所做的动作,我用它来显示动画加载图标,假设您已经提取了GIF并将其纳入资源中。

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

因为我认为,唯一的解决办法是所有者绘制。但是,获得一些参考代码是很好的,我希望它可以帮助未来的人。 – 2015-05-19 01:48:05

1

我推荐(免费的解决方案)使用后台工作人员在循环中以编程方式更新图标(并检查天气停止或继续)。这有点复杂,但我认为你明白了吗? = P