用双缓冲的办法
1. 重载Panel类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { class Panel2 : Panel { public Panel2() { this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); this.SetStyle(ControlStyles.DoubleBuffer, true); this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); } } }2. 创建Panel2 的实例化对象
在Form1.Designer.cs文件里
3. 用 Panel.Paint 方法中的 Graphics 重绘
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { bool bDraw = false; public Form1() { InitializeComponent(); timer1.Interval = 100; timer1.Start(); } private void button1_Click(object sender, EventArgs e) { bDraw = !bDraw; } private void timer1_Tick(object sender, EventArgs e) { if(bDraw) { panel1.Invalidate(); } } void update(Panel panel, Graphics g) { Random rd = new Random(); panel.BackColor = Color.FromArgb(rd.Next(0, 255), rd.Next(0, 255), rd.Next(0, 255)); int nW = panel.Width; int nH = panel.Height; for (int i = 0; i < 20; i++) { g.DrawLine(new Pen(Brushes.Green, 2), new Point(i * (nW / 20), 0), new Point(i * (nW / 20), nH)); g.DrawLine(new Pen(Brushes.Red, 2), new Point(0, i * (nH / 20)), new Point(nW, i * (nH / 20))); } } private void panel1_Paint(object sender, PaintEventArgs e) { update(panel1, e.Graphics); } } }4. 效果如图