[英]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
或图像; 在处理程序之外创建它们并重用它们。 如果需要使用长进程或网络连接的结果更新控件,请在处理程序外部创建Task
或BackgroundWorker
,并使完成例程保存结果并使控件无效。 在处理程序中使用保存的结果。 如果需要执行某种动画,请预先创建所有动画帧,使用计时器使显示无效,并在处理程序中绘制正确的帧。
WinForm图形是一个很大的主题,你需要得到一本书或者按照教程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.