暂停表单中的GIF

本文关键字:GIF 表单 暂停 | 更新日期: 2023-09-27 18:21:33

只是想知道如何暂停GIF图像?我正在访问服务器,我希望在发生某些事情时播放gif图像,如果系统冻结,我希望它暂停。我有一个图片盒,上面附有图片。这可能吗?

暂停表单中的GIF

PictureBox使用ImageAnimator类为GIF图像设置动画。它具有停止动画的Stop()方法。不幸的是,它没有暴露出你需要修改的成员,你必须自己使用ImageAnimator。

如果你不反对使用反射来绕过这些限制,那么你可以使用后门。这通常是一个相当糟糕的主意,但Winforms处于维护模式,PictureBox再次更改的可能性非常接近零。它看起来像这样:

using System.Reflection;
...
    private static bool IsAnimating(PictureBox box) {
        var fi = box.GetType().GetField("currentlyAnimating",
            BindingFlags.NonPublic | BindingFlags.Instance);
        return (bool)fi.GetValue(box);
    }
    private static void Animate(PictureBox box, bool enable) {
        var anim = box.GetType().GetMethod("Animate", 
            BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(bool) }, null);
        anim.Invoke(box, new object[] { enable });
    }

此示例按钮的Click事件可靠地停止并启动了动画:

    private void button1_Click(object sender, EventArgs e) {
        Animate(pictureBox1, !IsAnimating(pictureBox1));
    }

如果你不喜欢这些技巧,那就自己使用ImageAnimator。

将所需帧转换为位图

        Image gifImg = ActivscreenLibraries.Resources.throbber_running;
        FrameDimension dimension = new FrameDimension(gifImg.FrameDimensionsList[0]);
        // Number of frames
        int frameCount = gifImg.GetFrameCount(dimension);
        // Return an Image at a certain index
        gifImg.SelectActiveFrame(dimension, 5);
        Bitmap aa = new Bitmap(gifImg);
        pictureBox1.Image = Image.FromHbitmap(aa.GetHbitmap());

正如您在Micha链接的问题的评论中所读到的,您可以简单地设置

myPictureBox.Enabled = false;

以停止图像动画。将其设置为true以重新启动。不需要反射。

CCD_ 2实质上调用CCD_。请参阅源代码。