繁体   English   中英

C#位图 - 参数无效

[英]C# bitmap - Parameter is not valid

我在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;
            }));
        });
    }

当它运行时,它给出了该行的错误“参数无效”

buffer = new Bitmap(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();

            }
        }

    }

上面的代码运行不正常,我不太清楚为什么,如果有人可以提供帮助,我将不胜感激。 然而,我的主要问题不是如何解决它,但如果这甚至是一种有效或“正确”的绘制方式。

正如@TaW所说,存在许多问题。 我假设这是WinForms应用程序的Paint事件处理程序? 这是您应该告诉我们的重要信息。

每当表单内容中的任何内容需要重绘时,操作系统都会调用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处理程序中分配缓冲区, Brush或图像; 在处理程序之外创建它们并重用它们。 如果需要使用长进程或网络连接的结果更新控件,请在处理程序外部创建TaskBackgroundWorker ,并使完成例程保存结果并使控件无效。 在处理程序中使用保存的结果。 如果需要执行某种动画,请预先创建所有动画帧,使用计时器使显示无效,并在处理程序中绘制正确的帧。

WinForm图形是一个很大的主题,你需要得到一本书或者按照教程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM