c#位图-参数无效

本文关键字:无效 参数 位图 | 更新日期: 2023-09-27 18:01:53

我正在用c#制作一个基本的窗口游戏,我无法为屏幕创建一个基本的位图。我在屏幕上有一个面板,我希望能够绘制到它,所以我使用以下代码:

 public partial class GameWIndow : Form
{
    public GameWIndow()
    {
        InitializeComponent();
    }


    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        Bitmap buffer;
        buffer = new Bitmap(Width, Height);
        Task.Factory.StartNew(() =>
        {
            using (Graphics g = Graphics.FromImage(buffer))
            {
                g.FillRectangle(new SolidBrush(Color.PaleGoldenrod), 10, 10, 100, 100);
            }
            this.Invoke(new Action(() =>
            {
                this.BackgroundImage = buffer;
            }));
        });
    }

当它运行时,它给了我一个错误"Parameter is not valid"对于行

buffer = new Bitmap(Width, Height);

Width和Height分别为900和700,均为整数。

如果问题是我完全做错了,有什么更好的方法来完成它呢?

——编辑——

我看了你的评论,似乎我上面所做的是非常可怕的,所以我尝试了一种不同的方法,我不确定这是否更好。

    private Game game;
    private Thread renderThread;
    private Stopwatch stopwatch = new Stopwatch();
    public GameWindow()
    {
        InitializeComponent();
        //Starts game
        game = new Game();
        //Starts rendering
        this.DoubleBuffered = true;
        renderThread = new Thread(new ThreadStart(draw));
        renderThread.Start();
    }
    //Runs when screen is asked to refresh
    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        //Sends graphics to game class where it draws game
        game.draw(e.Graphics);
    }
    private void draw()
    {
        stopwatch.Start();
        while (true)
        {
            //If 1/60th of a sec has passed
            if (stopwatch.ElapsedMilliseconds > 1000D / 60D)
            {
                stopwatch.Restart();
                Invalidate();
            }
        }
    }

上面的代码不能正确运行,我不太确定为什么,如果有人能帮助我,我会很感激。然而,我的主要问题不是如何修复它,而是这是否是一种有效或"正确"的绘画方式。

c#位图-参数无效

正如@TaW所暗示的那样,存在许多问题。我想这是一个WinForms应用程序的油漆事件处理程序?那是你应该告诉我们的重要信息。

每当表单内容需要重绘时,操作系统就会调用Paint事件处理程序。PaintEventArgs为你提供了你必须绘制的ClipRectangle和你必须绘制的Graphics上下文。你应该只在你的处理程序中画这个;您不能执行任何其他处理、启动线程或执行任何I/O。如果你需要加载图像或执行I/O,你必须在处理程序之外完成,将结果保存到窗体属性中,使你想要绘制的矩形无效,然后使用保存的属性在Paint处理程序中进行绘制。它应该看起来像这样:

private void Panel1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawImage(_buffer, _position);
}

_buffer是什么?在处理程序外部填充Image_position吗?在处理程序外部更新的位置。

不要在Paint处理程序中分配缓冲区、 Brushes或图像;在处理程序外部创建它们并重用它们。如果您需要使用长进程或网络连接的结果更新控件,请在处理程序之外创建TaskBackgroundWorker,并让完成例程保存结果并使控件无效。在处理程序中使用保存的结果。如果您需要执行某种动画,请预先创建所有动画帧,使用计时器使显示无效,并在处理程序中绘制正确的帧。

WinForm图形是一个庞大的主题,你需要找一本书或跟随教程。