`
wsql
  • 浏览: 11778394 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

解决Windows 程序界面闪烁问题的一些经验

 
阅读更多

一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁。

先来谈谈闪烁产生的原因

原因一:
如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕
上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期。

一般显卡的刷新周期是 1/80秒左右,具体数字可以自己设置的。

这样问题就来了,一般画图都是先画背景色,然后再把内容画上去,如果这两次操作不在同一个
刷新周期内完成,那么给人的视觉感受就是,先看到只有背景色的图像,然后看到画上内容的图像,
这样就会感觉闪烁了。

解决方法:尽量快的输出图像,使输出在一个刷新周期内完成,如果输出内容很多比较慢,那么采用
内存缓冲的方法,先把要输出的内容在内存准备好,然后一次输出到显存。要知道一次API调用一般可以
在一个刷新周期内完成。

对于GDI,用创建内存DC的方法就可以了

原因二:

复杂的界面有多层窗口组成,当windows在窗口改变大小的时候是先重画父窗口,然后重画子窗口,子父
窗口重画的过程一般无法在一个刷新周期内完成,所以会呈现闪烁。

我们知道父窗口上被子窗口挡住的部分其实没必要重画的

解决方法:给窗口加个风格 WS_CLIPCHILDREN ,这样父窗口上被子窗口挡住的部分就不会重画了。

如果同级窗口之间有重叠,那么需要再加上 WS_CLIPSIBLINGS 风格

原因三:

有时候需要在窗口上使用一些控件,比如IE,当你的窗口改变大小的时候IE会闪烁,即使你有了WS_CLIPCHILDREN
也没用。原因在于窗口的类风格有CS_HREDRAW 或者 CS_VREDRAW,这两个风格表示窗口在宽度或者高度变化的时候
重画,但是这样就会引起IE闪烁

解决方法:注册窗口类的时候不要使用这两个风格,如果窗口需要在改变大小的时候重画,那么可以在WM_SIZE的时候
调用RedrawWindow。

原因四:

界面上窗口很多,而且改变大小时很多窗口都要移动和改变大小,如果使用MoveWindow或者SetWindowPos两个API来
改变窗口的大小和位置,由于他们是等待窗口重画完成后才返回,所以过程很慢,这样视觉效果就可能会闪烁。

解决方法:

使用以下API来处理窗口移动,BeginDeferWindowPos, DeferWindowPos,EndDeferWindowPos
先调用 BeginDeferWindowPos 设定需要移动的窗口的个数
使用DeferWindowPos,来移动窗口,这个API并不真的造成窗口移动
EndDeferWindowPos 一次性完成所有窗口的大小和位置的改变。

有个地方要特别注意,要仔细计算清楚要移动多少个窗口,BeginDeferWindowPos设定
的个数一定要和实际的个数一致,否则在Win9x下,如果实际移动的窗口数多于调用BeginDeferWindowPos
时设定的个数,可能会造成系统崩溃。在Windows NT系列下不会有这样的问题。


分享到:
评论

相关推荐

    visual c++ 程序开发范例宝典 随书CD 源码 窗体与界面设计

    5、界面窗体应用实例,包括:背景为渐变色的程序界面、椭圆形的程序界面、自绘窗体界面、类似windows XP的程序界面、窗体融合技术、限制对话框最大时窗口大小。6、多媒体宣传光盘应用实例,包括:多媒体宣传光盘主...

    Visual C++程序设计中Windows GDI贴图闪烁的解决方法

    本文实例讲述了Visual C++程序设计中Windows GDI贴图闪烁的解决方法。分享给大家供大家参考。具体如下: 一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候...

    MFC自定义界面包括按钮标签等,用于工控,展示等

    自定义界面不用任何windows控件,包括按钮,标答、窗口分割,动态自适应大小,全屏切换(F11),快捷键(S),对话框和主窗口交换数据,属性读取和设置,记忆上次的窗口状态,双缓存显示,不闪烁,自定义非窗口类...

    八皇后动态的游戏程序代码

    在Windows操作系统环境下实现,操作界面可以采用图形界面,也可以使用字符界面,使用Visual C++ 或其他面向对象的开发工具为开发平台。 在图形方式下,具体要求是:程序启动后显示一张8*8的棋盘,然后游戏者可以用...

    类似画图板的小程序-windows

    功能和界面全部模仿于Windows自带的画图板,界面如截图。功能主要有: 手绘线、简单图形、文字输入、图块拖放、重复撤销、画面缩放、打开保存图片文件,另外为了直接从数据库或者XML中存取图片,另外还提供了从Base...

    Delphi程序开发范例宝典(第3版).正解的

    实例016 类似windows xp的程序界面 20 实例017 以图形按钮显示的界面 22 实例018 以树型显示的程序界面 23 实例019 以xpmanifest组件显示界面 25 实例020 动态按钮的窗体界面 26 1.6 特殊形状的窗体...

    第一部分 界面设计

    实例025 如何拷贝当前程序界面 实例026 如何动态创建程序表单 实例027 如何遍历窗体所有组件 实例028 如何保证组件位置相对固定 实例029 如何在窗体中动态增加组件 实例030 如何使组件在程序运行时可以移动 ...

    c# icon 图标 特效 WINDOWS任务栏 动态生成 显示 闪动 变化 winform 难得的效果 显示任务栏所有窗口 像QQ那样闪动 打包 源码

    c# icon 图标 特效 WINDOWS任务栏 动态生成 显示 闪动 变化 winform 难得的效果 打包 源码 如果要像QQ那样闪动,其实很简单我里面这个例子,就是用一个TIME定时更改ICON图标.不过这里看起来的效果就是任务栏图标在...

    dos下的win31图形界面基础组件源程序

    该源码是 dos下的win31图形界面源程序 中的windows 图形界面标准化图形控件的源代码。 当前支持Label、Edit、Botton、Slider、Listbox、TreeView、ListView、Scrollbar和 Checkbox控件,其中的Edit控件支持剪切、...

    C#程序开发范例宝典 c#学习

    实例018 类似Windows Xp的程序界面...... 18 实例019 以图形按钮显示的界面...... 20 实例020 以树形显示的程序界面...... 21 实例021 动态按钮的窗体界面...... 22 1.6 特殊形状的窗体...... 24 实例022...

    联想Y570BIOS2.06版本,最稳定的BIOS

    2. 通过升级2011/4/25(随附)5ZJY22A之前生产的机器上的BIOS和触摸板驱动程序,修复了“Fn+F6”无法正常工作的问题:修复了将亮度调节到最低水平后AUO面板轻微闪烁的问题。修复了“Fn+F6”无法正常工作的问题,升级...

    Visual C++ 程序开发范例宝典光盘源码 (第二版)1/7

     实例023 椭圆形的程序界面   实例024 自绘窗体界面   实例025 以时钟显示界面   实例026 窗体融合技术   实例027 限制对话框最大时的窗口大小   实例028 分割视图窗口   实例029 对话框全屏...

    Visual C++ 程序开发范例宝典光盘源码 (第二版) 6/7

     实例023 椭圆形的程序界面   实例024 自绘窗体界面   实例025 以时钟显示界面   实例026 窗体融合技术   实例027 限制对话框最大时的窗口大小   实例028 分割视图窗口   实例029 对话框全屏...

    Visual C++ 程序开发范例宝典光盘源码 (第二版) 4/7

     实例023 椭圆形的程序界面   实例024 自绘窗体界面   实例025 以时钟显示界面   实例026 窗体融合技术   实例027 限制对话框最大时的窗口大小   实例028 分割视图窗口   实例029 对话框全屏...

    Visual C++ 程序开发范例宝典光盘源码 (第二版) 5/7

     实例023 椭圆形的程序界面   实例024 自绘窗体界面   实例025 以时钟显示界面   实例026 窗体融合技术   实例027 限制对话框最大时的窗口大小   实例028 分割视图窗口   实例029 对话框全屏...

    Visual C++ 程序开发范例宝典光盘源码 (第二版) 2/7

     实例023 椭圆形的程序界面   实例024 自绘窗体界面   实例025 以时钟显示界面   实例026 窗体融合技术   实例027 限制对话框最大时的窗口大小   实例028 分割视图窗口   实例029 对话框全屏...

    dxPack2 v2.0.1 (界面控件)

    很好的界面控件,包含如下组件: - dxContainer (无闪烁容器) - dxWinXPBar (WindowsXP 样式导航条) - dxButton (WindowsXP 样式按钮) - dxToolButton (WindowsXP/OfficeXP 样式工具按钮) - dxCheckBox (WindowsXP/...

    C#程序开发范例宝典(第2版).part08

    实例018 类似Windows XP的程序界面 18 实例019 软件启动界面 19 实例020 以树形显示的程序界面 20 实例021 动态按钮的窗体界面 21 1.6 特殊形状的窗体 23 实例022 非矩形窗体 23 实例023 建立字体形状窗体 24 ...

Global site tag (gtag.js) - Google Analytics