通过特殊处理 Resize 事件解决 WinForm 加载时闪烁问题的一个方法

WinForm 上放置的控件多了或者有大背景图,窗体加载时就会闪烁,对于一般的闪烁,设置 DoubleBuffer=True或许有一点改善,要立竿见影的解决可以重载 CreateParams 使用 WS_CLIPCHILDREN 参数初始化窗体,相关的文章网上多不胜数,这里也就不再赘述。

WS_CLIPCHILDREN 方法虽好,但是就其原理,不是哪里都能拿来用的。比如需要子窗体刷新的场景下,如绘图或者实时视频显示的时候上了这一剂猛药,就玩不下去了,需要改换其他的办法。

最近在MDI子窗体上加载 SplitContainer 控件,然后在控件的 Panel里面加载多个自定义的VideoPlayer控件就遇到了Form Load 时窗体闪烁严重的问题。

通过 Debug.Print 在窗体加载过程中的所有事件中输出日志,很快发现是MDI子窗体加载,最大化,激活等等触发了很多次 Resize,每次 Resize 都会导致窗体重绘,于是对症下药,针对这种情况,增加一个计数器,先将作为容器的 SplitContainer 控件 Hide 起来,等到Resize 够了再把它 Show 出来。前后对比,闪烁问题改善明显。

复制代码
 1     Public Sub New()
 2         ' 此调用是设计器所必需的。
 3         InitializeComponent()
 4         ' 在 InitializeComponent() 调用之后添加任何初始化。
 5         SplitContainer1.Hide()
 6     End Sub
 7 
 8     Private _iResized As Int32
 9     Protected Overrides Sub OnResize(e As EventArgs)
10         MyBase.OnResize(e)
11 
12         _iResized += 1
13         Debug.Print("============================ OnResize {0} ({1}) ============================",
14             _iResized, Me.Size) 15 16 17 18 If _iResized = 5 AndAlso SplitContainer1.Visible = False Then 19 '5 是统计得出的窗体加载过程中最后一次 Resize 20 Application.DoEvents() 21 SplitContainer1.Show() 22 End If 23 End Sub
复制代码

这个办法一点都不高大上,希望能帮到不能使用 WS_CLIPCHILDREN 解决闪烁问题的人。

posted @   树欲静·而风不止  阅读(1050)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示