近期在做一个项目时涉及到了重绘,但是在重绘后出现了窗口的闪烁。
在查询了网上的资料后了解了双缓存,加入了双缓存后依旧出现了闪烁的情况。之后在看大神写的程序时发现,在程序刷新时可能会出现清除背景随后加入了窗体消息拦截。具体代码如下:
首先需要设置开启控件的双缓存
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true);
然后先绘制在画板中然后一次性输出到界面上
//获取画板大小 Rectangle rect = e.ClipRectangle; //创建画板 BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current; BufferedGraphics myBuffer = currentContext.Allocate(e.Graphics, e.ClipRectangle); Graphics g = myBuffer.Graphics; g.SmoothingMode = SmoothingMode.HighQuality; g.PixelOffsetMode = PixelOffsetMode.HighSpeed; g.Clear(this.BackColor); //绘制 using (TextureBrush Txbrus = new TextureBrush(desBmp)) g.FillRectangle(Txbrus, rect); //显示到界面 myBuffer.Render(e.Graphics); //释放资源 g.Dispose(); myBuffer.Dispose();
最后启动消息拦截
protected override void WndProc(ref Message m) { const int WM_ERASEBKGND = 0x14; if (m.Msg == (int)WM_ERASEBKGND) { m.Msg = (int)IntPtr.Zero; } base.WndProc(ref m); }
以上是解决重绘后闪烁问题的方法