窗口控件闪烁在SKINSE中的解决方案

本文深入探讨了窗口控件闪烁的原理,分析了闪烁的两种主要原因,并提供7种有效的解决方案,包括合理设置窗口风格、移除特定重绘风格、内存拷贝缓冲技术等。适用于界面开发中遇到的窗口闪烁问题,尤其是复杂窗口层次结构的场景。
摘要由CSDN通过智能技术生成

    在界面开发过程中,我们常常要处理窗口控件闪烁的问题,而在实际情况中,难以达到理想要求,在开发SkinSE换肤的过程中,实现了20几种控件的绘制,为了解决窗口闪烁问题,曾经花去大量的时间,查阅了大量资料,这里就做一个的总结。

       在阅读本文之前,请认真阅读第一、第二部分,这对闪烁有一个非常深刻的认识。

 

闪烁的原理

 

       GDI绘制图像向屏幕输出的时候,不是立即在显示屏上面显示,而是首先讲数据写入显存,而显卡每隔一段时间把显存的数据显示到显示屏。这个时间间隔就是我们通常所说的屏幕刷新频率(一般台式显示器是80 HZ,液晶显示器是60 HZ)。如果在一个刷新周期内,没有完成一次绘制的操作,那么就是在几个刷新周期内完成,这样给人的感觉就是一闪一闪的感觉,这就是我们要解决的问题:窗口控件的闪烁。

 

闪烁的原因

 

       常见的闪烁分为两种,一种是窗口控件本身绘制背景的闪烁,一种重叠窗口闪烁。

       分析第一种情况:窗口控件本身的绘制过程,通常是首先绘制窗体背景,然后再绘制用户需求的绘制,如果整个绘制过程相当的复杂,绘制过程所需时间大于我们显示屏的刷新周期,就出现闪烁。(读到这里,可能读者第一知觉就是缓存技术,如果绘制非常频繁,缓存技术也会闪烁,怎么解决呢?下文将给出解答)

       分析第二种情况:重叠窗口的闪烁。如下图所示情况:

    图一

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SKINSE界面库最新版3.1. SKINSE高级特性 1.SKINSE界面库内部没有完全采用HOOK拦截窗口的机制,主要采用子类化控件,修改窗口过程函数的方式进行界面美化。但是内置HOOK技术,可以动态设置HOOK,保证了SKINSE在整理构架上的灵活性。 2.SKINSE界面库内置DirectUI绘制思想,将界面绘制元素抽象成图片、文本、矩形区域、线条、动画,并且内置EventItem、DrawItem绘制机制。可以将这些绘制元素以及绘制机制组合开发,实现按钮、单选框、复选框、分组框、Tab控件、动画控件等界面控件。 3.SKINSE界面库提供了非常丰富的API接口,最大限度的让SKINSE界面库更加透明化、个性化,让SKINSE界面库的使用范围得到最大延伸。 4.SKINSE界面库在子类化进行控件美化的时候,尽量不修改控件的默认属性,最大程度地兼容window标准控件的默认属性。比如,目前市场上很多界面库在绘制窗口标题栏的时候,去掉了窗口的WS_CAPTION属性, 导致GetClientRect、GetWindowRect方法失效,从而加大了界面开发和设计的难度,当然也导致不能完美支持SDI/MDI等界面框架。 5.SKINSE界面库提供了界面控件动态布局的特性。省去了程序开发最为繁琐的窗口控件位置的调整。只需要调整一下XML配置属性,就可以进行完美布局。 6.SKINSE界面库支持BMP、ICO、PNG、JPG等图片格式,支持皮肤色调变换,提供SKINSE内部的图像引擎接口。 7.SKINSE界面库支持SDI、MDI等界面框架,支持20余种界面控件,完整兼容window 2000、window2003、window XP、vista、window7当前的主流操作系统。并且支持window平台的VC、.NET、VB6、Delphi、C++ Builder、PowerBuilder、易语言等多种计算机语言开发。
什么是SKINSE SkinSE是一款真正意义上适合软件界面开发的C++界面库。采用XML管理GDI资源(如:图片、字体、颜色等),最大程度将界面与逻辑分开,让程序员有更多的时间去进行软件内部的逻辑处理。SKINSE扩展了非常丰富的API接口,兼容其他界面控件,使界面开发更加灵活、高效。SkinSE只用到了windows几个底层的核心库,没有用到(MFC/ATL等第三方库),采用纯API编写,采用C语言导出方式,增强可移植性,可以用于多种计算机语言。 SKINSE高级特性 1.SKINSE内部没有完全采用HOOK拦截窗口的机制,主要采用子类化控件,修改窗口过程函数的方式进行换肤。但是内置HOOK,可以动态设置HOOK,保证了SKINSE在整理构架上的灵活性。 2.SKINSE内置DirectUI绘制思想,将界面绘制元素抽象成图片、文本、矩形区域、线条、动画,并且内置EventItem、DrawItem绘制机制。可以将这些绘制元素以及绘制机制组合开发,实现按钮、单选框、复选框、分组框、Tab控件、动画控件等界面控件。 3.SKINSE提供了非常丰富的API接口,最大限度的让SKINSE界面库更加透明化、个性化,让SKINSE界面库的使用范围得到最大延伸。 4.SKINSE在子类化进行控件换肤的时候,尽量不修改控件的默认属性,最大程度地兼容window标准控件的默认属性。比如,目前市场上很多界面库在绘制窗口标题栏的时候,去掉了窗口的WS_CAPTION属性, 导致GetClientRect、GetWindowRect方法失效,从而加大了界面开发和设计的难度,当然也导致不能完美支持SDI/MDI等界面框架。 5.SKINSE提供了界面控件动态布局的特性。省去了程序开发最为繁琐的窗口控件位置的调整。只需要调整一下XML配置属性,就可以进行完美布局。 6.SKINSE支持BMP、ICO、PNG、JPG等图片格式,支持皮肤色调变换,提供SKINSE内部的图像引擎接口。 7.SKINSE支持SDI、MDI等界面框架,支持20余种界面控件,完整兼容window 2000、window2003、window XP、vista、window7当前的主流操作系统。并且支持window平台的多种计算机语言开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值