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

一般的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系列下不会有这样的问题。

时间: 2024-09-27 01:26:45

解决Windows 程序界面闪烁问题的一些经验 ZT的相关文章

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

一般的windows 复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小的时候出现闪烁.先来谈谈闪烁产生的原因原因一:如果熟悉显卡原理的话,调用GDI函数向屏幕输出的时候并不是立刻就显示在屏幕上只是写到了显存里,而显卡每隔一段时间把显存的内容输出到屏幕上,这就是刷新周期.一般显卡的刷新周期是 1/80秒左右,具体数字可以自己设置的.这样问题就来了,一般画图都是先画背景色,然后再把内容画上去,如果这两次操作不在同一个刷新周期内完成,那么给人的视觉感受就是,先看到只有背

菜鸟急求,关于windows程序界面设计的。自己想了好长时间了,百度了很多资料也没看到点眉目

问题描述 菜鸟急求,关于windows程序界面设计的.自己想了好长时间了,百度了很多资料也没看到点眉目 是这样的,我想在一个主窗口里,放置几个按钮控件,分别用来更新同一块矩形区域,但是每一个按钮按下,区域显示的内容是不一样的,并且擦除之前的内容,功能就 像图片里的那些按钮,能够控制下边显示的内容, 我用了InvalidateRect(hwnd,&rect,TRUE)发现区域只是闪了一下,并没有擦除任何内容,尤其是之前区域里的按钮控件也没有删除掉.导致新按钮和旧按钮都显示着. 查资料的时候,看到了

解决绘图时闪烁问题的一点经验

清除屏幕闪烁 (转自网上) <一> 由于作图过于复杂和频繁,所以时常出现闪烁的情况,一些防止闪烁的方法,如下: (1)将Invalidate()替换为InvalidateRect().Invalidate()会导致整个窗口的图象重画,需要的时间比较长,而InvalidateRect()仅仅重画Rect区域内的内容,所以所需时间会少一些.不要为一小块区域的重画就调用Invalidate(),不愿意自己去计算需要重画的Rect,事实上,如果你确实需要改善闪烁的情况,计算一个Rect所用的时间比起重

安装Visual Studio 2013 卡在Windows 修补程序界面

问题描述 安装Visual Studio 2013 卡在Windows 修补程序界面 卡在这个界面快一个小时了,怎么回事? 解决方案 应该是在下载补丁程序,你在安装之前最好把检查更新的选项要关掉,不然慢的让你哭,现在用13还不如用15 解决方案二: 安装Visual Studio Community 2013Visual Studio 2013 community 安装Windows 安装ACE,在Visual Studio 2013测试通过 解决方案三: 自己用上面的修补代码,百度下载下来安装

解决Windows系统十大最常见问题

  Windows XP系统的脆弱应该是众所周知的,在操作过程总会出现这样那样的问题,并且还不时出现系统崩溃等罢工现象,这样给使用者带来很大的困难.那些系统出现问题后,对于一些新手或系统操作不熟的用户有些束手无措,在此我们列举了Windows XP中常见的一些故障及解决办法,希望能抛砖引玉给大家带来帮助. 一.如何应对丢失密码故障? 为了安全经常为电脑设置设置密码,可是时时出现遗忘密码的现象,请问如何找回系统的登录密码. 1.BIOS密码忘了怎么办 问:我在BIOS中设置了开机密码,可以最近忽然

ASP程序界面的多语言支持

程序 ASP程序界面的多语言支持 可能有的web应用程序,需要多语言支持,例如,讨论组,既有中文界面,以适合国人使用的方便,又需要英文界面,以满足国际化的需要.我想,似乎没有必要为每一个语言都写一个版本,这不仅比较繁琐,而且以后程序升级就必须修改所有版本的程序.熟悉vc++程序的朋友一定知道通常windows应用程序的国际化手段都是通过rc文件来解决的.只要重新加入不同语言版本的rc文件编译一下就行了.asp程序不能编译也不需编译.我于是开始考虑使用数据库,将ASP程序中使用到的提示信息/甚至图

用MS-DOS解决Windows不能解决的问题

Windows 操作系统在很早以前已经接过了DOS 系统传出的接力棒,默默无闻的履行着历史赋予的重任.但是,因为功能"拙劣"而惨遭淘汰的DOS 时常还是会被人重提,它有时候显得更是"神通广大". 为什么呢?大家知道,在很多时候,Windows 系统做不到的事情,"老土帽"--DOS还有能大显身手的.比如,当你使用的操作系统崩溃了,而手头的安装盘有没有办法自启动功能,这时候DOS 就非得被请出山不可了.呵呵,到此为止,废话少说!还是赶快来看看MS-

解决应用程序正常初始化(0xc0000135)失败

今天计算机G了一个XPSP3,但是在安装程序的时候出现应用程序正常初始化(0xc0000135)失败,百度了一下发现了问题所在. 应用程序正常初始化(0xc0000135)失败解决方法 这是由于没有安装.NET framework 所造成的,请安装.NET framework.下载地址:微软官方地址:http://download.microsoft.com/download/3/F/0 /3F0A922C-F239-4B9B-9CB0-DF53621C57D9/dotnetfx3.exe 华军

解决Windows 7下安装Oracle 11g相关问题的方法_oracle

很多DBA目前还停留在Oracle 9i或者10g,究其原因有可能是Oracle 11g的价格问题.本文将为大家讲解在Windows 7下安装Oracle 11g,也希望大家能从中看到11g的一些新特点. 前不久卸载掉了自己的Windows Vista系统,装上了Windows7 旗舰版,在装机过程中也遇到了很多问题,有些问题是自己不曾遇到过的,但自己尝试着去解决,一步一步尝试着去努力.自己的不懈努力,也换回了成果.比如在装SQL Server 2005和Oracle 11g时就碰到了问题,在装