سؤال

أرغب في إظهار GIF متحرك مثل صورة علامة التبويب على TabPage.

إذا أضفت صورتي إلى ImageList واستخدام TabPage.ImageIndex خاصية، تظهر فقط الإطار الأول (ولا تحريك):

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

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

تقترح بعض المنتديات على الشبكة أيضا ImageList لا يدعم صور متحركة.

هل هناك طريقة سهلة لعرض GIF متحركة كصورة على TabPageب هل يجب علي المالك رسم وتحريك الصورة؟

هل كانت مفيدة؟

المحلول

هذه إجابة متأخرة ولكن نأمل أن يستفيد شخص ما من ذلك، أدناه ما قمت به لتحريك الصورة في 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;

نصائح أخرى

أوصي (للحصول على حل حر) باستخدام عامل الخلفية يقوم بتحديث الرمز برمجيا في حلقة (والتحقق من الطقس للتوقف أو الذهاب). إنه مجمع بعض الشيء لكنني أعتقد أنك تحصل على الفكرة الصحيحة؟ = ص

devexpress لديه أ imagecollection. وهو ما يشبه جدا ويدعم GIF.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top