我在c#中制作了一个基本的窗口化游戏,我无法为屏幕创建基本的位图。我在屏幕面板,并且我希望能够吸引到它,所以我用下面的代码: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();
}
}
}
上面的代码不能正常运行,我不太清楚为什么,如果有人可以提供帮助的,我对此表示赞赏。然而,我的主要问题不是如何解决这个问题,但如果这是一个有效的或“正确的”绘制方式。
这个问题很可能是你完全错误的。我不知道为什么你会得到这个错误,但是禁止从其它线程修改GUI。 (仔细阅读,这绝对不是你得到这个错误的原因,但该规则仍然适用。) – adv12
你想做什么?这看起来有点可疑。 'PaintEventArgs'已经包含了你应该绘制的'Graphics'的一个实例。 – vcsjones
如果您为该控件启用了双缓冲样式,则只需以最直接的方式编写“Paint”事件处理代码即可。 –