我一直在学习使用位图绘制面板。我以为我会运行一个试用程序来简单地将白色面板变成黑色。 (看起来似乎是一种复杂的方式,但这只是为了测试基础)我的程序如下:
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);
}
}
}
}
当我运行它并按下按钮时,面板似乎没有改变。任何我想错的想法。提前谢谢。
答案 0 :(得分:3)
您必须invalidate面板的客户区域,以便Windows强制重新绘制。但还有一些其他问题:
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();
}
答案 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)
试试这个例子 我用它来做你想做的事情并且有效。 我希望能帮助你