C#解决加载大图片闪烁问题的花招

    近日,研究一个小项目时,总会有些小问题,因为设计到界面的优化,原本弄了一张大的图片做软件背景,但是后来却发现,C#在最小化和还原的时候会出现图片的闪烁的问题。因为图片多大,无法一时间内加载过来,后来用到了窗体的双缓存,感觉基本上没什么用。

    后来只好将图片改小,用PS把图片截成三部分,不过效果还是一样。

    很是纠结,不过后来在用到Timer控件时,却突发奇想,能否将Timer控件弄到主窗体中,将主窗体的Opacity属性(控制窗体的透明度)更随Timer控件变化呢?

    果然如此,在最小化时,设置Opacity的属性值为0,在还原的时候利用Timer控件中的Tick()方法,将Opacity的属性值慢慢增长到1,只要将增长值设置的稍大一点,把Timer控件的Interval设置更小一点,就可以达到一种渐出的效果,轻松的解决了窗体闪烁的问题,而且窗体在还原的时候也能给人一种特殊的效果。

下面是VB代码:

    Timer控件内的Tick事件(不过首先要定义一个全局变量 i double型):

 1     Private Sub timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timer.Tick
2
3 If i >= 1 Then
4
5 timer.Stop()
6
7 End If
8
9 i = i + 0.2
10
11 Me.Opacity = i
12
13 End Sub

  

然后在显示还原的事件里面加上一句:timer.Start()。不过要注意,每次最小化的时候要把Opacity的属性值设置为0,还有i也要设置为0哦!

    当然C#里面会“闪”的貌似不少,还有一个TreeView控件也一样,用过TreeView控件的都知道,如果设置了TreeView控件的图标,有时候会在图标的交换的时候出现闪烁的情况,例如:我要在TreeView控件中设置有子节点的没有子节点的分别为两种不同的图标,各位可能会知道,光在初始化的时候设置时不行的,因为TreeView中的AfterSelect事件会将图标更换掉(目前还不知道原因),不过可以设置TreeView1.SelectedNode.SelectedImageIndex,但是这样的话图标更换是解决了,但是当你选择不同的图标的时候,整个控件都会“闪”一下,给人看上去很不爽,后来百度了很久都没有答案,即使加上双缓存也没有用,后来偶尔在一本书上看到答案:就是在设置节点的图标的时候,同时设置节点的SelectedNode.SelectedImageIndex属性,这样就不会出现闪烁的情况了。

原文地址:https://www.cnblogs.com/zjw112/p/2126707.html