C# Panel Graphic 绘图闪烁解决办法

    技术2022-07-10  123

    用双缓冲的办法

    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. 效果如图 

    Processed: 0.009, SQL: 9