Devexpress Winform打开Tab页,防止闪屏的三种方法

一、闪屏是什么吗?
解:两个窗口在做切换或者打开动作的时候,屏幕会出现短暂的闪烁,闪烁一会后,才会正常显示所需要的窗口。

二、为什么会出现闪屏?
解:1.在做切换或者打开窗体时,窗体要进行绘制,如果窗体有大量的控件,前景色和背景色为透明时,会需要大量的时间进行绘制,就会导致窗体的刷新很慢很卡,这就造成了闪屏的出现。

三、防止闪屏的三种方法
解:
1.忽略 WM_ERASEBKGND 背景消息,同时使控件绘制到缓冲区而不是直接绘制到屏幕,这段代码可以减少闪屏。
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);

2.启用windows样式,在窗体代码中加入这段代码:

 protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x02000000;
                return cp;
            }
        }

3.启用双缓冲,适用于win7以下系统:


        protected override CreateParams CreateParams
        {
            get
            {

                CreateParams cp = base.CreateParams;

                cp.ExStyle |= 0x02000000;  
                if (this.IsXpOr2003 == true)
                {
                    cp.ExStyle |= 0x00080000;  
                    this.Opacity = 1;
                }

                return cp;

            }

        }  //防止闪烁

        private Boolean IsXpOr2003
        {
            get
            {
                OperatingSystem os = Environment.OSVersion;
                Version vs = os.Version;

                if (os.Platform == PlatformID.Win32NT)
                    if ((vs.Major == 5) && (vs.Minor != 0))
                        return true;
                    else
                        return false;
                else
                    return false;
            }
        }

项目遇到情况:通过Dev的树形控件切换不同窗体会出现闪烁,通过改变窗体打开的顺序,同时在打开窗体的启动位置加上( 代码:SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true))。完美解决闪屏问题。

 private void treeList1_DoubleClick(object sender, EventArgs e)
        {


            TreeListNode curNode = this.treeList1.FocusedNode;
            if (curNode == null) return;
            string name = curNode.GetValue("KeyDisplayName").ToString().Trim();
            string formname = curNode.GetValue("TableName").ToString().Trim();

            if (formname != "")
            { 

                if (name != "")                       {

                    foreach (XtraTabPage page in xtraTabControl1.TabPages)
                    {
                        if (page.Text == name)
                        {
                            xtraTabControl1.SelectedTabPage = page;//显示该页  
                            return;
                        }
                    }

                    XtraTabPage xpage = new XtraTabPage();

                    ObjectHandle obj = Activator.CreateInstance(null, "SalePro." + formname + "");   //需要加上项目名称 SalePro 

                    if (obj != null)
                    {
                        Form frm = (Form)obj.Unwrap();

                        //放在Tab前面,会出现闪烁。
                     //   frm.Visible = true;
                        frm.Dock = DockStyle.Fill;
                        frm.FormBorderStyle = FormBorderStyle.None;
                        frm.TopLevel = false;//加载窗体必要的属性  
                        xpage.Controls.Add(frm);
                        xpage.Text = name;    
                        xtraTabControl1.TabPages.Add(xpage);
                        xtraTabControl1.SelectedTabPage = xpage;
                         //放在Tab后面,防止闪烁,
                        //同时在打开窗体的启动位置加上( 代码:SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true))
                        frm.Visible = true;                     
                    }
                }
            }
        }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值