无论我按下按钮多少次,下面的代码都不会起作用,这真让我烦恼
private void button2_Click(object sender, EventArgs e)
{
Bitmap screen = new Bitmap(600, 800);
Graphics gfx = Graphics.FromImage(screen);
SolidBrush brush = new SolidBrush(Color.FromArgb(255, 255, 0));
gfx.FillRectangle(brush, 0, 0, 600, 800);
gfx.Dispose();
brush.Dispose();
screen.Dispose();
}
答案 0 :(得分:0)
您没有将位图绘制到屏幕上。你可以这样做:
private void button2_Click(object sender, EventArgs e)
{
Bitmap screen = new Bitmap(600, 800);
Graphics gfx = Graphics.FromImage(screen);
SolidBrush brush = new SolidBrush(Color.FromArgb(255, 255, 0));
gfx.FillRectangle(brush, 0, 0, 600, 800);
CreateGraphics().DrawImage(screen, 0, 0);
gfx.Dispose();
brush.Dispose();
screen.Dispose();
}
但是你不应该使用它,因为它阻止了最佳的DoubleBuffering工作,并且每当paint事件被触发时都会删除更改,因此不是很好的做法。
相反,您应该处理Paint事件(要执行此操作,请转到设计器(在后面的代码中按F7),选择您的表单,打开属性窗口(按F4),选择事件选项卡(单击闪电螺栓)并双击右侧的字段 Paint ):
private void Form1_Paint(object sender, PaintEventArgs e)
{
Bitmap screen = new Bitmap(600, 800);
Graphics gfx = Graphics.FromImage(screen);
SolidBrush brush = new SolidBrush(Color.FromArgb(255, 255, 0));
gfx.FillRectangle(brush, 0, 0, 600, 800);
e.Graphics.DrawImage(screen, 0, 0);
gfx.Dispose();
brush.Dispose();
screen.Dispose();
}
然而,在这种情况下不建议使用位图,因为您没有显示太多 - 而是应该直接绘制到表单的图形:
private void Form1_Paint(object sender, PaintEventArgs e)
{
using (var gfx = e.Graphics)
using (var brush = new SolidBrush(Color.FromArgb(255, 255, 0)))
gfx.FillRectangle(brush, 0, 0, 600, 800);
}
您可能会注意到我使用了using
,这是一种很好的做法,因为它会自动处理对象。
现在你所要做的就是(你必须为两个解决方案做这个,包括处理paint事件)是在你的按钮点击事件处理中调用Invalidate()
并设置一个告诉paint方法的属性它被调用是因为按下按钮:
private void Form1_Paint(object sender, PaintEventArgs e)
{
if (!_button2Pressed)
return;
using (var gfx = e.Graphics)
using (var brush = new SolidBrush(Color.FromArgb(255, 255, 0)))
gfx.FillRectangle(brush, 0, 0, 600, 800);
_button2Pressed = false;
}
private void button2_Click(object sender, EventArgs e)
{
_button2Pressed = true;
Invalidate();
}
private bool _button2Pressed;
这应该这样做。