Loading... ## 前言 大家在制作**MyKTV**的时候前台页面会使用到各种各样的图片素材,大到窗体背景,小到按钮图片,当我们把大量的图片素材添加到窗体中的时候,就会出现一个让人头痛的问题: 1. 面板(`panel`)隐藏和显示切换的时候,页面会出现屏闪现象 2. 窗体第一次加载的时候,页面会出现屏闪现象 很多同学也不会在意这个小问题,但是这个问题的确也影响程序的运行美观和操作。 我相信很多同学都有碰到过这样的问题,很多同学也都自己通过搜索网络资源,也找到了这个问题的解决方案,今天的这篇文章就是把大伙采集到的方案总结一下。 ## 方案1:直接使用双缓冲 我们将下方的代码添加到窗体的构造函数中: ```cs public Frmxxx() //不要复制这行代码 { InitializeComponent(); //窗体、控件初始化 //添加下面的代码 this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.ResizeRedraw, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景 this.SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲 this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); //代码添加结束 } ``` 满怀期待的运行测试了一波,貌似并没有很大的效果。 ## 方案2:重写CreateParams方法 将下面的代码写在窗体类文件中: ```csharp protected override CreateParams CreateParams { get { CreateParams paras = base.CreateParams; paras.ExStyle |= 0x02000000; return paras; } } ``` 再次运行测试,貌似效果非常不错,但是**这个方法会影响一些其他控件、组件的重绘**(这点才是致命的),有点治标不治本的感觉。 ## 方案3:扩展Panel类 继续寻找网上的方案,看到最多,评论最好的一个方案就是:扩展`Panel`类,这个实现起来有点麻烦,如果你的项目快做完了,要切换这个方案的话,一定要谨慎操作。 在项目中新建一个类`PanelExt.cs` 将下面的代码写入到这个类中: ```cs /// <summary> /// Panel面板扩展类 /// </summary> class PanelExt : Panel { /// <summary> /// OnPaintBackground 事件 /// </summary> /// <param name="e"></param> protected override void OnPaintBackground(PaintEventArgs e) { // 重载基类的背景擦除函数, // 解决窗口刷新,放大,图像闪烁 return; } /// <summary> /// OnPaint 事件 /// </summary> /// <param name="e"></param> protected override void OnPaint(PaintEventArgs e) { // 使用双缓冲 this.DoubleBuffered = true; // 背景重绘移动到此 if (this.BackgroundImage != null) { e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; e.Graphics.DrawImage( this.BackgroundImage, new System.Drawing.Rectangle(0, 0, this.Width, this.Height), 0, 0, this.BackgroundImage.Width, this.BackgroundImage.Height, System.Drawing.GraphicsUnit.Pixel); } base.OnPaint(e); } } ``` 重新生成项目,将之前我们建立窗体中的Panel容器换为我们新封装的PanelExt容器,再运行程序,程序背景闪烁的问题就**完美解决**了! 重新生成项目之后,我们可以在工具箱中找到我们刚刚创建的自定义控件“`PanelExt`”,它的使用和普通的`Panel`时一样的,同样也支持拖拽。 --- 今天的分享就此结束了,如果大家有什么问题,可以在评论区告诉我。 最后修改:2022 年 01 月 02 日 © 允许规范转载 赞 都滑到这里了,不点赞再走!?