MDI窗体不闪烁要领测试通过:
//.net 4.0用OptimizedDoubleBuffer
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
this.UpdateStyles();
真正有效的要领:在最上层窗体加上
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
不才层的窗体和自界说控件加上
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN
return cp;
}
}
注意:如果加错处所或人品欠好,某些时候可能会造成控件绘制略微不正常。
**** 如果人品发生发火的话,貌似不才层窗体直接加cp.Style &= ~0x02000000就行,,不需要在上层窗体加cp.ExStyle |= 0x02000000;
**** 注意下层窗体代码在ListBox或者ListView的Anchor设有Right,且窗体BackColor与控件配景差此外时候,可能会发明控件初始化显示不正常。需要做一下MdiParent.Refresh或者打消Right
引用MSDN中对CreateParams的说明:
在你开发的重载控件中不要重写这个属性,通过这个属性控制控件的某些气势派头。只有在你封装Windows控件或者想实现某些WinForm没有供给的气势派头(好比Layered Window)控制的时候再使用这个属性。更多信息请参照MSDN上对CreateWindow要领和CreateWindowEx要领的参数CREATESTRUCT布局体的文档注释 。
简述为何CreateParams能够实现这样高级的样式控制,因为从CreateWindow和CreateWindowEx的名字就可以看出,CreateParam是通报给这俩个要领的参数,而这两个要领又是在窗体创建的时候挪用的。所以,CreateParam才华够实现如此强大的样式控制。
节点更新要使用BeginUpdate和EndUpdate
这一对操纵对付需要批量操纵更新控件的情景有对照好的效果,好比初始化时批量添加了大量节点。坏处就在于不能即时更新。所以,对付频繁的更新节点并但愿当即反应到界面的情况不适用。如果使用并且没有禁失断根界面动静的话,则控件看起来就会不竭的闪烁,而且以白底为主,内容几乎不偏见(这个视频繁水平而定)。因为界面更新都在EndUpdate处完成,操纵太多导致EndUpdate梗阻时间过长,且清空在先,更新在后,导致界面看起来永劫间处于空白状态。
某些情况下可以使用禁止配景更新
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0014) return;// 禁失断根配景动静
base.WndProc(ref m);
}
public ListViewNF()
{
// 开启双缓冲
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
// Enable the OnNotifyMessage event so we get a chance to filter out
// Windows messages before they get to the form‘s WndProc
this.SetStyle(ControlStyles.EnableNotifyMessage, true);
}
protected override void OnNotifyMessage(Message m)
{
//Filter out the WM_ERASEBKGND message
if (m.Msg != 0x14)
{
base.OnNotifyMessage(m);
}
}
******************************************
给与LockWindowUpdate API