解决双缓冲的关键技术:
1、设置显示图元控件的几个属性: 必须要设置,否则效果不是很明显!
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw |ControlStyles.AllPaintingInWmPaint, true);
2、窗口刷新一次的过程中,让所有图元同时显示到窗口。
可以通过以下方式实现,这种方式涉及到Graphics对象的创建方式。
Graphics对象的创建方式:
a、在内存上创建一块和显示控件相同大小的画布,在这块画布上创建Graphics对象。接着所有的图元都在这块画布上绘制,绘制完成以后再使用该画布覆盖显示控件的背景,从而达到“显示一次仅刷新一次”的效果!
实现代码(在panel_Paint方法中):
private Int16 point_x = 50, point_y = 50;
int j = 0;
private void panel_Paint(object sender, PaintEventArgs e)
{
Bitmap bMap= new Bitmap(panel.Width, panel.Height);
Graphics g = Graphics.FromImage(bMap);
g.Clear(this.BackColor);
g.SmoothingMode = SmoothingMode.HighQuality; //高质量
g.PixelOffsetMode = PixelOffsetMode.HighQuality; //高像素偏移质量
g.DrawEllipse(Pens.Blue, point_x, point_y, 8, 8);
g.FillEllipse(new SolidBrush(Color.Blue), point_x, point_y, 8, 8);
if (j % 2 == 0)
{
point_x = (short)(point_x + 1);
point_y = (short)(point_y + 1);
}
j++;
txtX.Text = (point_x + 10).ToString();
txtY.Text = (point_y + 10).ToString();
using (Graphics tg = e.Graphics)
{
tg.DrawImage(bMap, 0, 0); //把画布贴到画面上
}
}