gpt4 book ai didi

.net - ImageList/TabPage 中的动画 GIF

转载 作者:行者123 更新时间:2023-12-01 00:08:42 25 4
gpt4 key购买 nike

我想在 TabPage 上显示一个动画 GIF 作为标签图像.

如果我将我的图像添加到 ImageList并使用 TabPage.ImageIndex属性,它只显示第一帧(并且不显示动画):

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

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

网上一些论坛也提示 ImageList不支持动画 GIF。

是否有一种简单的方法可以在 TabPage 上将动画 GIF 显示为图像? ?我必须自己绘制图像并制作动画吗?

最佳答案

这是一个迟到的答案,但希望有人能从中受益,下面是我为 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;

关于.net - ImageList/TabPage 中的动画 GIF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/796186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com