WinForm加载多个自定义控件时,会出现很严重的闪烁问题,很卡,一块一块的加载(像打开网页时,网络很卡的那种感觉)简直没法忍受。
在网上搜索了好久,网上大部分的方法是一下4种,但是都不能有效的解决问题。
1.将DoubleBuffered 设置 true,用双缓存处理Form界面内容加载,可以提高页面显示质量。或者
SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); this.UpdateStyles();
参数说明:
UserPaint
如果为 true,控件将自行绘制,而不是通过操作系统来绘制。此样式仅适用于派生自 Control 的类。
AllPaintingInWmPaint
如果为 true,控件将忽略 WM_ERASEBKGND 窗口消息以减少闪烁。仅当 UserPaint 位设置为 true 时,才应当应用该样式。
DoubleBuffer
如果为 true,则绘制在缓冲区中进行,完成后将结果输出到屏幕上。双重缓冲区可防止由控件重绘引起的闪烁。要完全启用双重缓冲,还必须将 UserPaint 和 AllPaintingInWmPaint 样式位设置为 true。
2.把构造方法里的内容尽量移动到Form_load事件里处理。
3.把控件绘制的Pint()写到一起绘制。
4.在控件使用后有变化时可以采用先 挂起 再显示的方法,提高显示质量。
this.tableLayoutPanel2.SuspendLayout(); 2 this.SuspendLayout(); 3 tableLayoutPanel2.Controls.Clear(); 4 5 tableLayoutPanel2.ColumnCount = value.ColumnCount; 6 tableLayoutPanel2.ColumnStyles.Clear(); 7 for (int i = 0; i < this.tableLayoutPanel2.ColumnCount; i++) { 8 this.tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F/this.tableLayoutPanel2.ColumnCount)); 9 } 10 11 this.tableLayoutPanel2.RowCount = value.ReservedCount / value.ColumnCount; 12 tableLayoutPanel2.RowStyles.Clear(); 13 for (int i = 0; i < tableLayoutPanel2.RowCount; i++) { 14 this.tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 100F/tableLayoutPanel2.RowCount)); 15 } 16 17 // 动态添加控件 18 // 在这儿添加你的代码 19 ... 20 21 22 tableLayoutPanel2.ResumeLayout(true); 23 this.ResumeLayout(true);
你只有试了你就会发现,以上这几种办法并不能解决问题。
解决办法:
在调用自定义控件的窗体内添加的:
1 protected override CreateParams CreateParams 2 { 3 get 4 { 5 CreateParams cp = base.CreateParams; 6 cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED 7 return cp; 8 } 9 }
在自定义控件中添加的:
protected override CreateParams CreateParams { get { var parms = base.CreateParams; parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN return parms; } }