`
weizhai12
  • 浏览: 149404 次
  • 性别: 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系列下不会有这样的问题。


分享到:
评论

相关推荐

    C# 双缓冲区实现解决屏幕闪烁问题

    在编程领域,尤其是在开发图形用户界面(GUI)应用时,屏幕闪烁是一个常见的问题。当界面元素频繁更新或者动画效果执行时,用户可能会看到不连贯的图像闪烁,这主要是由于重绘过程中的屏幕刷新率与应用程序更新率不...

    VC6下的GDI+双缓冲 解决闪烁问题

    总的来说,GDI+双缓冲技术在解决Windows应用程序中的闪烁问题上发挥了重要作用。对于开发者来说,理解并熟练运用这一技术能够显著改善用户的交互体验,使得应用程序看起来更加流畅和专业。通过实践和研究提供的源码...

    VB程序 窗体闪烁。。。。。

    在VB(Visual Basic)编程环境中,窗体闪烁是一个常见...通过上述方法,我们可以有效地解决VB程序中窗体闪烁的问题,提高用户体验。同时,理解并应用好VB的事件处理机制和UI更新策略,是编写高效、流畅的VB程序的关键。

    窗体闪烁程序

    窗体闪烁程序是一种在计算机图形用户界面中常见的现象,特别是在使用C#进行Windows应用程序开发时。窗体闪烁可能由于各种原因出现,如双缓冲机制未正确应用、UI更新不一致或者绘制过程中的其他问题。本程序是针对这...

    MFC窗口隐藏时解决闪烁问题

    首先,了解闪烁的原因是解决问题的关键。在Windows系统中,当一个窗口需要更新其内容或者改变大小、位置时,系统会执行一系列步骤,包括重绘、擦除背景等,这个过程就可能导致闪烁。对于MFC窗口来说,隐藏和显示窗口...

    透明窗体示例_解决闪烁问题

    在Windows编程中,创建具有透明效果的窗口是一项常见的任务,特别是在开发用户界面时,透明窗口可以为应用程序提供更现代和吸引人的外观。本示例主要关注如何在VC++环境中实现半透明窗口,并解决动态调整透明度时...

    VB闪动界面程序文件

    VB(Visual Basic)是微软公司开发的一种编程语言,主要用于创建Windows桌面应用程序。"VB闪动界面程序文件"指的是使用VB编程实现的具有动态效果的用户界面。这种界面通常通过改变控件的属性或使用动画效果来吸引...

    解决vb窗体闪烁导致控件显示不全

    在进行计算机辅助设计(CAD)软件的二次开发时,经常会遇到一些技术难题,其中一个较为常见的问题是VB.NET开发环境下窗体的闪烁现象。这不仅会影响用户体验,还可能导致控件显示不全等问题。本文将详细探讨这一问题...

    Windows程序设计

    5. 未解决问题 尽管取得了显著的成果,程序仍存在一些待解决的问题。例如,目前的程序没有实现鼠标事件的响应,这意味着用户无法通过点击或拖动来互动。此外,程序也不接受用户输入时间,限制了其功能性。这些问题...

    MFC空间闪烁问题汇总及解决方案

    通过上述分析和解决方案,我们可以有效地解决MFC应用程序中的控件闪烁问题。双缓冲技术不仅可以提高应用程序的性能,还能显著改善用户体验。希望这些方法能够帮助开发者们解决实际开发中遇到的相关问题。

    windows小画板程序

    3. **消息循环与事件处理**:Windows程序通常有一个消息循环,用来接收和处理来自操作系统的消息。例如,当用户点击鼠标或按下键盘时,系统会产生相应的消息,程序需要通过`GetMessage`、`TranslateMessage`和`...

    对话框程序图标闪烁 显示jpg图片

    总结起来,实现“对话框程序图标闪烁 显示jpg图片”这一功能需要结合Windows API的对话框创建、定时器设置、图片处理和资源管理等多个技术点。通过合理地整合这些知识点,我们可以创建一个动态、吸引人的对话框程序...

    停车场问题Windows程序源码

    《停车场问题Windows程序源码解析》 在计算机科学与信息技术领域,模拟真实世界的问题并用编程语言解决是常见的练习方式。本篇将深入探讨一款基于Windows平台,利用C++编程语言实现的“停车场问题”程序源码。该...

    Windows CE Clock 时钟显示程序

    Windows CE Clock时钟显示程序是一款专为Windows CE操作系统设计的应用,旨在提供一个高效且无闪烁的时钟界面。Windows CE是微软开发的一个嵌入式操作系统,广泛应用于掌上电脑、移动设备和工业控制系统等。这款时钟...

    双缓冲显示位图 解决刷新时的闪烁问题

    在计算机图形学中,"双...通过分析和运行这些代码,我们可以更深入地理解如何在实际项目中应用双缓冲技术,解决屏幕闪烁问题,提升用户体验。不过,具体的代码实现细节和平台依赖性需要参考实际文件内容来进一步解释。

    Clock 小时钟显示程序 windows CE

    总之,"Clock小时钟显示程序"是一个针对Windows CE操作系统的应用程序,通过采用双缓冲技术,有效地解决了在显示实时更新信息时可能出现的屏幕闪烁问题,提高了用户体验。这个程序的开发涉及到嵌入式系统编程、图形...

    windows系统无法正常联网并打开应用程序解决办法

    在日常使用Windows系统的过程中,有时我们会遇到系统联网后右下角的网络图标持续闪烁、除资源管理器外其他应用程序均无法正常启动的问题。这种情况不仅影响了用户的正常使用体验,还可能导致重要工作无法按时完成。...

    双缓冲技术解决刷新闪烁_thenq78_Vc_

    在计算机图形学和软件开发中,特别是在Windows编程中,"双缓冲技术"是一个重要的概念,用于优化用户界面的更新和防止闪烁。这个技术主要应用于GUI(图形用户界面)应用程序,尤其是那些需要频繁更新画布或者窗口内容...

    PNG图层动画不闪烁演示程序

    PNG图层动画不闪烁演示程序是一个使用VC6.0编写的示例应用,它展示了如何在Windows环境下处理PNG图像,特别是那些包含透明通道的PNG图片,以实现平滑且无闪烁的动画效果。这个程序的核心技术是利用PNG的alpha通道...

    双缓冲解决屏幕闪烁问题

    在计算机图形学和GUI编程中,"双缓冲"是一种有效解决屏幕闪烁问题的技术。当程序在屏幕上绘制图形或更新界面时,如果没有采取适当的措施,可能会出现闪烁现象,这主要是因为屏幕刷新与数据更新不同步导致的。双缓冲...

Global site tag (gtag.js) - Google Analytics