Winform MDI窗体切换不闪烁的解决步伐(测试通过)

时间:2022-06-16 05:06:53

 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