C# WinForm窗体大小变化后页面切换控件闪烁的解决方法

C# WinForm窗体大小变化后页面切换控件闪烁的解决方法

问题描述

窗体大小变化后页面切换控件闪烁,用了双缓冲也无效。

制作WinForm页面时,页面上有大量控件,导致窗体页面切换时控件加载闪烁。按照网上的双缓冲解决方法可以解决第一次页面加载后页面切换的闪烁问题。代码如下:

   
   public MainForm()
   {
       InitializeComponent();
      //设置控件风格
       SetStyle(
           ControlStyles.AllPaintingInWmPaint |  //全部在窗口绘制消息中绘图
           ControlStyles.OptimizedDoubleBuffer, //使用双缓冲
           true);
     
   }
   /// <summary>
   /// 重写函数处理闪屏
   /// </summary>
   protected override CreateParams CreateParams
   {
       get
       {
           CreateParams cp = base.CreateParams;
           cp.ExStyle |= 0x02000000;
           return cp;
       }
   }
   

但是窗体最小化后再变大后,页面切换控件依然闪烁。


解决方案:

设置窗体的TransparencyKey,用窗体编辑器或写在初始化代码中都可以。

this.TransparencyKey = System.Drawing.Color.LightGray;

添加此方法后,窗体加载时会先出现整片的LightGray片刻后进入窗体。再在窗体的Resize方法中添加如下方法:

 private Timer Timer = null;
 
 private void MainForm_Resize(object sender, EventArgs e)
 {
     
      if (this.WindowState == FormWindowState.Normal)
      {
          Timer = new Timer() { Interval = 100 };
          Timer.Tick += new EventHandler(Timer_Tick);
          base.Opacity = 0;
          Timer.Start();
      }
  }
 private void Timer_Tick(object sender, EventArgs e)
 {
       if (this.Opacity >= 1)
       {
           Timer.Stop();
       }
       else
       {
           base.Opacity += 0.2;
       }
   }

窗体大小切换后页面再切换不会再闪烁了。