使用位图作为缓冲区绘制到面板

时间:2012-08-31 17:14:17

标签: c# winforms bitmap panel system.drawing

我一直在学习使用位图绘制面板。我以为我会运行一个试用程序来简单地将白色面板变成黑色。 (看起来似乎是一种复杂的方式,但这只是为了测试基础)我的程序如下:

public partial class Form1 : Form
{
    private Bitmap buffer = new Bitmap(100,100);

    public Form1()
    {
        InitializeComponent();
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
       e.Graphics.DrawImageUnscaled(buffer, Point.Empty);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {
            for (int j = 0; j < 100; j++)
            {
                buffer.SetPixel(i, j, Color.Black);
            }
        }
    }
}

当我运行它并按下按钮时,面板似乎没有改变。任何我想错的想法。提前谢谢。

3 个答案:

答案 0 :(得分:3)

您必须invalidate面板的客户区域,以便Windows强制重新绘制。但还有一些其他问题:

    正如@Tony建议的那样,
  1. FillRectangle将比在循环中绘制每个像素做得更有效率。
  2. 如果面板在buffer准备好显示之前失效,您可能会遇到并发问题。确保位图生成与其显示隔离。
  3. 这些建议总结(但没有经过测试)如下:

    private void button1_Click(object sender, EventArgs e)
    {
        Bitmap tempBuffer = new Bitmap(100, 100);
    
        using (Graphics g = Graphics.FromImage(tempBuffer))
        using (SolidBrush blackBrush = new SolidBrush(Color.Black))
        {
            g.FillRectangle(blackBrush, new Rectangle(0, 0, tempBuffer.Width-1, tempBuffer.Height-1);
        }
    
        buffer = tempBuffer;
        panel1.Invalidate();
    }
    

答案 1 :(得分:2)

除了使面板的客户区无效外,如果您希望在单击按钮时绘制它,您还需要在按钮的单击事件中连接绘制事件。试一试:

public partial class Form1 : Form
{
    private bool _paintWired;

    public Form1()
    {
        InitializeComponent();
    }

    private void PanelPaint(object sender, PaintEventArgs e)
    {
        using (Graphics g = this.panel1.CreateGraphics())
        {
            g.FillRectangle(Brushes.Black, this.panel1.Bounds);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if(!_paintWired)
        {
            this.panel1.Paint += new PaintEventHandler(PanelPaint);
            _paintWired = true;
        }

        this.panel1.Invalidate();
    }
}

更新:抱歉,我错过了使用位图的要点。

答案 2 :(得分:0)

试试这个例子 我用它来做你想做的事情并且有效。 我希望能帮助你

example_1