博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决Winform应用程序中窗体背景闪烁的问题
阅读量:6657 次
发布时间:2019-06-25

本文共 1940 字,大约阅读时间需要 6 分钟。

本文转载:https://my.oschina.net/Tsybius2014/blog/659742

我的操作系统是Win7,使用的VS版本是VS2012,文中的代码都是C#代码。

这几天遇到一个问题,即我用一个嵌入图片的Panel作为Winform应用程序的背景,如下图所示:

这是一个Winform窗体,里面放置了一个Panel,Dock属性为Fill,BackgroundImage使用了《少年电世界》2003年第02期的封面图片,BackgroundImageLayout使用了Stretch。

这个界面现在有两个问题:

1、在窗体第一次被打开时,背景图片会出现明显的闪烁

2、在拉动窗体的边界以调整窗体大小时,背景图片非出现明显的闪烁

为了处理这一问题,我查了一些资料,也都逐个试过了,下面先说下其中的两个有代表性方法:

方法1:直接使用双缓冲

SetStyle(ControlStyles.UserPaint, true);SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景. SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲

我尝试着将这段代码加到窗体的构造函数中,并不能解决问题,闪烁依然非常明显

在MSDN上还有一篇文章《如何通过对窗体和控件使用双缓冲来减少图形闪烁》

地址:

这篇文章中也介绍了一个方法使用双缓冲:

SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

这个方法依然不能解决问题

方法2:重写CreateParams方法

方法2需要将以下这段代码放在Form类的代码内

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

这个方法我一开始尝试的时候一度认为是有效的,但使用了一段时间后还是发现了问题:

1、这个方法可以解决问题1,但不能解决问题2

2、这个方法会影响一些其他控件、组件的重绘(这点才是致命的)

因此,这个方法也不能解决问题

上面两个方法都不能解决问题,于是我继续求助度娘,终于在下面这个页面找到了解决方法:

方法3:封装Panel类

这个方法,需要新建一个PanelEnhanced类继承Panel类,代码如下:

///  /// 加强版 Panel ///  class PanelEnhanced : Panel { ///  /// OnPaintBackground 事件 ///  ///  protected override void OnPaintBackground(PaintEventArgs e) { // 重载基类的背景擦除函数, // 解决窗口刷新,放大,图像闪烁 return; } ///  /// OnPaint 事件 ///  ///  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容器换为我们新封装的PanelEnhanced容器,将程序的背景图片放到里面,再运行程序,程序背景闪烁的问题就完美解决了!(自测(非作者)后发现也有问题,就是如果图片有透明的部分,会被绘成黑色的,也有问题,尴尬。。)

转载于:https://www.cnblogs.com/dachuang/p/8608354.html

你可能感兴趣的文章
JDBC
查看>>
mvn打包spring工程成jar时报Unable to locate Spring NamespaceHandler for XML schema namespace错误解决办法...
查看>>
【Python】元组
查看>>
localStorage
查看>>
JZ2440 裸机驱动 第14章 ADC和触摸屏接口
查看>>
RvmTranslator6.0
查看>>
javascript三元操作符
查看>>
typedef与define的区别
查看>>
根据外键名称获取外键表名
查看>>
(实用)win7/8修改远程桌面连接默认端口
查看>>
WCF实现REST服务
查看>>
make软件包安装
查看>>
页面开机自启动,页面置顶显示,页面持续获得焦点,鼠标点击器源码
查看>>
centos7配置mono和jexus5.6.2
查看>>
My 1st webUI try
查看>>
mac 浏览器 强刷快捷键
查看>>
[转载]SQL Server行列转换实现
查看>>
Mysql之Centos6.5+Mysql5.6搭建配置
查看>>
Micropython TurnipBit 吃豆小人
查看>>
第一次写JQuery插件--用于显示子菜单
查看>>