C#Graphics.FillRectangle根本不起作用

时间:2017-04-22 01:46:54

标签: c# winforms bitmap

无论我按下按钮多少次,下面的代码都不会起作用,这真让我烦恼

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();
        }

1 个答案:

答案 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;

这应该这样做。