• 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属性,这样就不会出现闪烁的情况了。

  • 相关阅读:
    机器学习到深度学习资料
    安装CentOS 6停在selinux-policy-targeted卡住的问题解决
    U盘安装Ubuntu 16.04出现:Failed to load ldlinux.c32
    Ubuntu 16.04下使用UNetbootin制作的ISO镜像为U盘启动出现:Missing Operating System (mbr.bin)
    为什么Linux的Fdisk分区时First Sector为2048?
    Windows下将ISO镜像制作成U盘启动的工具(U盘启动工具/UltraISO/Rufus/Universal-USB)
    CentOS 6.9安装类型选择(Basic Server/Web Server)
    Java中String与byte[]的转换
    IntelliJ IDEA插件-翻译插件
    Mycat查询时出现:Error Code: 1064. can't find any valid datanode
  • 原文地址:https://www.cnblogs.com/zjw112/p/2126707.html
Copyright © 2020-2023  润新知