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

转载于:https://blog.51cto.com/8241237/1348024

【Visual C++】Windows GDI贴图闪烁解决方法相关推荐

  1. GDI+ 绘图闪烁解决方法

    GDI+ 绘图闪烁解决方法 参考文章: (1)GDI+ 绘图闪烁解决方法 (2)https://www.cnblogs.com/rogation/p/3708473.html 备忘一下.

  2. 安装程序无法继续因为计算机上安,Windows安装无法继续怎么办?Windows安装无法继续的解决方法...

    在使用电脑的日常过程中,经常会遇到一些问题,当系统出现了严重的问题或系统崩溃时,只能通过重装系统来解决问题.有用户反馈在重装系统时会出现提示windows安装无法继续的情况,需要用户重启后重新安装(华 ...

  3. 深度学习部署:Windows安装pycocotools报错解决方法

    深度学习部署:Windows安装pycocotools报错解决方法 1.pycocotools库的简介 2.pycocotools安装的坑 3.解决办法 更多Ai资讯:公主号AiCharm 本系列是作 ...

  4. Windows系统“无法打开”故障解决方法之一

    Windows系统"无法打开"故障解决方法 无法打开"我的电脑","我的文档"等 解决方法:可能是Explorer程序出错了,通过下面的方法 ...

  5. winform频繁刷新导致界面闪烁解决方法

    winform频繁刷新导致界面闪烁解决方法 参考文章: (1)winform频繁刷新导致界面闪烁解决方法 (2)https://www.cnblogs.com/arxive/p/6270007.htm ...

  6. C#Winform频繁刷新导致界面闪烁解决方法

    C#Winform频繁刷新导致界面闪烁解决方法 参考文章: (1)C#Winform频繁刷新导致界面闪烁解决方法 (2)https://www.cnblogs.com/ghbjimmy/article ...

  7. Ubuntu鼠标移动中闪烁解决方法

    Ubuntu鼠标移动中闪烁解决方法 更新显卡/核显驱动即可,到官网找驱动

  8. PADS 在 Windows 11 下闪退解决方法

    PADS 在 Windows 11 下闪退解决方法   Windows 11是由微软公司(Microsoft)开发的操作系统,应用于计算机和平板电脑等设备, 于2021年6月24日发布,2021年10 ...

  9. Win7运行程序时弹出“windows防火墙安全警报“的解决方法

    win7系统运行程序时经常弹出Windows安全警报,提示"Windows 防火墙已阻止程序的部分功能"到底怎么回事呢?其实这是防火墙为防止一些程序恶意访问网络而设定的,我们知道W ...

  10. windows系统coursera视频播放出错解决方法

    windows系统coursera视频播放出错解决方法 问题 解决办法 步骤一 步骤二 步骤三 问题 coursera视频播放总是失败,一直转圈 解决办法 修改hosts文件. 步骤一 利用https ...

最新文章

  1. Python 中的属性访问与描述符
  2. python爬虫requests源码链家_python的爬虫项目(链家买二手房)
  3. 东北大学java期末试卷,[东北大学]18年6月考试《Java语言程序设计I》考核作业(答案)...
  4. 计算机网络-基本概念(7)【网络层】-多协议标记交换MPLS
  5. 计算机的硬件简介,计算机基础之硬件简介(Day2)(示例代码)
  6. react-性能优化
  7. js十秒没有点击怎么判断_MAC口红怎么判断真假?没批号就没有生产日期,网友:品控太差...
  8. jdbc连接对象的获取 20210409233805735
  9. 动荡下如何自救 | 社招一年收割BATDK算法offer
  10. C#线程系列讲座(5):同步技术之Monitor
  11. zabbix监控mysql 图_zabbix监控mysql
  12. 方舟修改服务器代码,方舟生存进化服务器可以用代码吗
  13. QThread如何优雅实现暂停(挂起)功能
  14. 静态链接库和动态链接库
  15. DRAM 内存介绍(一)
  16. 处理器后面的字母含义_科普向,笔记本cpu结尾字母的含义
  17. 在Excel中怎么筛选唯一值或删除重复值以及对其应用条件格式
  18. 5S现场管理法(转载)
  19. Java面试题总结及答案总结
  20. nrf52832 学习笔记(七)蓝牙协议层级理解

热门文章

  1. java 不安全操作_Java新手求助:怎么会出现使用了未经检查或不安全的操作。
  2. linux代码诊断有没有link,Linux下判断网线是否插入的代码
  3. Jquery通过ajax加载json,jquery ajax json 异步加载数据
  4. java 栈泛型_使用泛型实现栈结构
  5. 主线程 唤醒_JAVA多线程--线程阻塞与唤醒
  6. android ndk opencv 3,opencv_and_opencv_contrib
  7. linux ls -l 日期乱码,请教-关于ls-l的日期显示问题
  8. vscodemaven 配置_vscode配置maven的settings.json
  9. 修改sqlserver编码为utf8_修改Matlab默认编码格式为UTF-8
  10. Codeforces Round #371 (Div. 2)