2

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

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

当我运行它并按下按钮时,面板似乎没有改变。任何想法我哪里出错了。先感谢您。

4

3 回答 3

3

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

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

更新:对不起,我错过了使用位图的要点。

于 2012-08-31T17:32:04.887 回答
3

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

  1. 正如@Tony 建议的那样, FillRectangle将比在循环中绘制每个像素更有效。
  2. 如果面板在buffer准备好显示之前失效,您可能会遇到并发问题。确保位图生成与其表示是隔离的。

这些建议总结(但未经测试)如下:

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();
}
于 2012-08-31T17:24:19.173 回答
0

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

示例_1

于 2012-08-31T17:33:44.293 回答