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

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

  1. 获取windows程序界面数据

    文章目录 结论 可以尝试的其他方向 最后的挣扎 基础知识 win7/win10查看某个进程的句柄数 句柄的概念 Windows MFC.SDK和API的区别和联系 Windows MFC(C++开发) ...

  2. 使用 Dev-C++开发windows程序界面设计

    很多年前学过C++,但没有怎么使用过.最近有时间,准备重新学起来,以便可以编写自己喜欢的程序. 关于C++编译器,讨论文章已经很多.详细对比的文章也很多,我只是说说我一个初学者的感受. 就我自己而言, ...

  3. 如何优雅解决Windows程序的0xc0000022错误(应用程序无法正常启动)

    一.问题现象: 双击打开.pptx文件时,出现了下面的错误弹框: 这种弹框的Windows的弹框,并不是PowerPoint软件的弹框.软件问题的可能性极低.另外,我在当前目录下新建了一个.pptx文 ...

  4. 解决 小程序界面数据不显示问题

    遇到小程序获取向数据详情,后台返回的是个obj对象, 我直接setData到一个空对象 苹果手机的页面不显示 安卓手机可以显示 解决这个问提 直接在当前显示改数据的view 标签上添加 wx:if 属 ...

  5. python 程序化交易信号闪烁_请版主帮忙解决一下程序信号闪烁的问题-开拓者知识 -程序化交易(CXH99.COM)...

    咨询内容: Params Numeric notaft(14.58); Vars Numericseries High5(0);// Numericseries Low5(0);// Numeric ...

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

    清除屏幕闪烁 (转自网上) <一> 由于作图过于复杂和频繁,所以时常出现闪烁的情况,一些防止闪烁的方法,如下: (1)将Invalidate()替换为InvalidateRect(). I ...

  7. Windows用户界面编程中的界面闪烁问题

    http://yyf9989.cnblogs.com/archive/2005/09/02/228320.html Windows用户界面编程中的界面闪烁问题 南京千里独行版权所有转载请保留本信息 在 ...

  8. windows程序消息机制(Winform界面更新有关)--转

    1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队 ...

  9. 解决Winform程序在不同分辨率系统下界面混乱问题

        问题分析:          产生界面混乱的主要原因是,winform程序的坐标是基于点(Point)的,而Point又与DPI相关,具体就是 一英寸 =72Points 一英寸 = 96pi ...

最新文章

  1. 现实世界的Windows Azure:采访圣地亚哥公共安全小组的技术经理Adrian Gonzalez
  2. C++写的一个简单的词法分析器(分析C语言)
  3. 第 20 课时:GPU 管理和 Device Plugin 工作机制(车漾)
  4. 接口,抽象类与内部类
  5. php curl 批量,PHP实现的curl批量请求操作
  6. outlook附件大小限制_如何在Outlook中调整大图片附件的大小
  7. 分段函数if语句_C语言函数系列之库函数中基础必会函数(一)
  8. python中popen的用法_python中的subprocess.Popen()使用
  9. nltk安装punkt等语料库时报SSL错误完美解决方案及离线安装方法
  10. 【bzoj2759】一个动态树好题
  11. 英语总结系列(十九):七月英语Baby成长史
  12. 我们梳理了国内外逾80家公司,发现6大关键趋势 | 36氪眼健康行业报告
  13. SSH框架(spring+struts2+hibernate)+Mysql实现的会议管理系统(功能包含会议室管理、会议管理、用户管理、部门管理、设备管理、个人资料编辑等)
  14. 第三届“马栏山杯” 国际音视频算法大赛
  15. 奥城大学计算机专业,我大四了,托福84,gre1571612.02..._GRE考试_帮考网
  16. 编写一个程序。要求输入5个学生的成绩(从0到100的整数)并将这5个数保存到文件“data.txt”中,然后再编写一个程序,从文件“data.txt”中读取这5个学生的成绩,计算并输出他们的平均数,然
  17. Java 形参和实参
  18. 电音(3)音色分类和调制
  19. C#/.NET 解析Cron表达式,根据Cron表达式获取最近执行时间
  20. 国防科大计算所诚招各路英才,本硕博不限!

热门文章

  1. FCKeditor 2.6 安装配置使用指南(asp)
  2. UA PHYS515A 电磁理论III 静磁学问题3 静磁学问题的边界条件与标量势方法的应用
  3. UA MATH567 高维统计I 概率不等式8 亚指数范数
  4. 初步了解OpenSSL命令
  5. VC++ 给选项卡控件添加不同图标
  6. VC++ 查看C++代码的汇编代码列表
  7. Win32 API 显示鼠标坐标位置
  8. WIN10 常用bug解决办法
  9. [JLOI 2012]树
  10. 哪位有方法把 dd/mm/yyyy的字符串 格式化成yyyy-mm-dd