winforms 是否有其他方法可以使用Graphics.DrawImage()?

cedebl8k  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(119)

我用我的paint方法绘制图像,使用的是e.Graphics.DrawImage(myImage);。e是paint事件参数。如果bool为真,我想显示一个动画,否则我想绘制一些其他的图像。
在paint事件方法中,我有类似于以下内容的代码:

if(myBool) 
{
  e.Graphics.DrawImage(nextFrame);
}
else
{
  e.Graphics.DrawImage(backgroundImage);
}

backgroundImage是我的背景图片,而不是我可以用实际的Form1 background属性替换的普通颜色。nextFrame是一个图像,它被设置为我想通过计时器播放的动画的下一帧。当我运行我的程序时,有明显的滞后,我认为这是因为每当调用paint方法时,我总是使用if语句。
如果有一种方法可以在另一种方法中使用e.Graphics.DrawImage();,那么我会使用它,这样if语句就更少了,或者有没有一种方法可以简化我的paint方法,使其不那么滞后。
注意:动画和背景图像覆盖了整个屏幕,分辨率为2256x1504,这意味着它们也可能导致延迟,在这种情况下,我需要找到一种方法来提高e.Graphics.DrawImage();的速度

zhte4eai

zhte4eai1#

您的问题是,是否有另一种方法可以使用Graphics.DrawImage快速绘制整个屏幕以用作动画。
一种“其他方法”是通过检测对myBool属性的更改并修改主窗体的BackgroundImage属性以响应此更改来间接调用它。如果myBool为true,则动画由迭代背景图像数组组成。
当我测试这种方法时,它看起来非常快,但是您可能需要实际运行clone我的示例,看看它对于您的应用程序是否足够快。

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
        DoubleBuffered = true; // Smoother if true but compare performance with/without.
        var dir = 
            Path.Combine(
                AppDomain.CurrentDomain.BaseDirectory,
                "Backgrounds");

        _backgrounds =
            Directory
            .GetFiles(dir)
            .Select(_ => (Bitmap)Bitmap.FromFile(_))
            .ToArray();
        BackgroundImage = _backgrounds[0];
        checkBoxMyBool.CheckedChanged += (sender, e) => myBool = checkBoxMyBool.Checked;
    }
    private readonly Bitmap[] _backgrounds;

    public bool myBool
    {
        get => _myBool;
        set
        {
            if (!Equals(_myBool, value))
            {
                _myBool = value;
                _ = onMyBoolChanged();
            }
        }
    }
    bool _myBool = false;
    private async Task onMyBoolChanged()
    {
        if(myBool)
        {                
            for (int i = 1; i < _backgrounds.Length; i++)
            {
                BackgroundImage = _backgrounds[i];
                await Task.Delay(100);
            }
        }
        else
        {
            BackgroundImage = _backgrounds[0];
        }
    }
}

相关问题