微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我有使用 win Forms 的无闪烁界面,但是当调整表单大小时,TabControl 内的控件开始闪烁

如何解决我有使用 win Forms 的无闪烁界面,但是当调整表单大小时,TabControl 内的控件开始闪烁

当涉及到某些预定义事件(例如最大化、最小化和调整大小)以及它们与 WndProc 的关系时,我并不完全了解发生的所有事情。

我的软件旨在成为某种 GUI 生成界面,我有一堆自定义控件,客户可以从库中获取这些控件并将它们放置在面板中,主选项卡控件的选项卡内。 tab控件也可以添加更多的Tab,但是所有的控件基本上都在Main TabControl里面。 客户可以根据需要添加任意数量的控件,并且可以动态修改变量和数据并保存配置以便以后加载。

经过大量工作,我设法获得了一个非常可靠的界面,几乎没有闪烁,有时当控件数量太多时,从一个选项卡切换到另一个选项卡会很慢,但是,界面处理得非常好好吧,它根本不显示闪烁。

我的问题是:

当我的主窗体被调整大小、最小化或最大化时,整个界面开始闪烁,但闪烁并不是控件每个部分的超级烦人的闪烁,自定义控件似乎画得很好,但我可以看到每个一一控制绘画。

不知何故,在我看来好像有一个配置在第一次加载表单时被正确应用,但是当表单被调整大小时它会丢失。

我的代码很长,我不知道放在这里有什么意义,但是这段代码基本上是我用来避免界面启动时闪烁的代码

 #region FLICKER CONTROL
        private const int WM_SETREDRAW = 0x0B;
        private const int WM_ERASEBKGND = 20;


        class DrawingControl
        {
            [DllImport("user32.dll")]
            public static extern int SendMessage(IntPtr hWnd,Int32 wMsg,bool wParam,Int32 lParam);
            public static void SuspendDrawing(Control parent)
            {
                SendMessage(parent.Handle,WM_SETREDRAW,false,0);
            }
            public static void ResumeDrawing(Control parent)
            {
                SendMessage(parent.Handle,true,0);
                parent.Refresh();
            }
          
        }
       
   static void SetDoubleBuffer(Control ctl,bool DoubleBuffered)
        {
            typeof(Control).InvokeMember("DoubleBuffered",BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,null,ctl,new object[] { DoubleBuffered });
        }

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

 private void ToggleFormlevelDoubleBuffering(bool EN)
        {
            enableFormlevelDoubleBuffering = EN;
            this.MaximizeBox = true;
        }
        private void Form1_Shown(object sender,EventArgs e)
        {
            ToggleFormlevelDoubleBuffering(true);
        }

        #endregion

使用上面的代码,界面不会闪烁,直到表格被调整大小/最大化。 我一直在尝试覆盖 WncProc 以捕获 MAximize 、 Minimize 和 restore 事件,并覆盖 OnResizeBeginOnResizeEnd 事件,但我还没有找到一段代码来纠正闪烁在调整表单大小后发生。

我还尝试在我的表单构造函数添加删除 SetDoubleBuffer 函数,以便为包含自定义控件的所有面板启用双缓冲区功能。并没有什么区别,它起初工作正常,但后来停止了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。