窗口刷新的几个函数:InvalidateUpdateWindowRedrawWindow

一:什么时候才会发生重绘窗口的消息? 
      当需要更新或重新绘制窗口的外观时,应用程序就会发送WM_PAINT消息。对窗口进行重新绘制。

二:Invalidate() -- RedrawWindow() -- UpdateWindow()三个函数有什么异同? 
     Invalidate()是强制系统进行重画,但是不一定就马上进行重画。因为Invalidate()只是通知系统,此时的窗口已经变为无效。强制系统调用WM_PAINT,而这个消息只是Post就是将该消息放入消息队列。当执行到WM_PAINT消息时才会对敞口进行重绘。 
    UpdateWindow只向窗体发送WM_PAINT消息,在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT。 
    RedrawWindow()则是具有Invalidate()和UpdateWindow()的双特性。声明窗口的状态为无效,并立即更新窗口,立即调用WM_PAINT消息处理。

三:刷新组合
InvalidateRect(hctrl,null,true) ;

UpdateWindow(hctrl); 
这两个函数组合起来是什么意思呢?

InvalidateRect是会触发WM_PAINT事件,但是不是立即就触发,一般都会等当前操作的过程结束才触发, 如果需要立即触发,那么配合UpdateWindow()使用就可以了。

先执行InvalidateRect,再执行UpdateWindow().

/************************************************************************************/

1.Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。
2.UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多只有一条)的无效区。
3.效果很明显,当调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列。
4.如果调用Invalidate之后想马上更新屏幕,那就加上UpdateWindow()这条语句。 
MSDN的解释 
UpdateWindow 
The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT

message to the window if the window's update region is not empty. The function sends a WM_PAINT

message directly to the window procedure of the specified window, bypassing the application queue.

If the update region is empty, no message is sent.

InvalidateRect 
The system sends a WM_PAINT message to a window whenever its update region is not empty and

there are no other messages in the application queue for that window.

翻译成中文大概的解释如下: 
  UpdateWindow:如果有无效区,则马上sending a WM_PAINT message到窗口处理过程,不进消息队列进行排队等待,立即刷新窗口,否则,什么都不做。 
InvalidateRect:设置无效区,如果为NULL参数,则设置整个窗口为无效区。当应用程序的那个窗口的消息队列为空时,则sending a WM_PAINT message(即使更新区域为空).在sending a WM_PAINT message的所有InvalidateRect的更新区域会累加。

1:设置无效区 
InvalidateRect

2:立即刷新 
UpdateWindow();

如果不调用 InvalidateRect就调用 UpdateWindow,那么UpdateWindow什么都不做。 ??????
如果调用 InvalidateRect 后不调用UpdateWindow,则系统会自动在窗口消息队列为空的时候,系统自动发送一WM_PAINT消息。

调用UpdateWindow()时将会发送一个WM_PAINT消息,而应用程序在接收到WM_PAINT消息后,将自动地调用Invalidate(),所以,在程序代码中,不一定要出现Invalidate()!

UpdateWindow()就是立即发送WM_PAINT消息,只对声明无效的区域起作用,   
  Invalidate()则是声明无效的方式之一。

Invalidate()表示客户区域无效,在下次WM_PAINT发生时重绘。而WM_PAINT是由系统进行维护的,每当CWnd的更新区域不为空,并且在应用程序的窗口消息队列中没有其它消息时,Windows就发送一条WM_PAINT消息。   
  Invalidate里面有个bool型的参数,用来标识重绘的时候是否用背景色填充。是不是用SetBkcolor函数?下去继续研究。

updateWindow则是要求系统对区域进行立即重绘。

看到有人在网上提出问题,他在Invalidate后面又写了绘图的函数但是没有执行,因为invalidate执行过以后转到PAINT命令了。所以后面的都没有显示。

也终于想通我绘的图一直在闪啊闪,因为我在PAINT里面用到Invalidate()函数,所以他不停的自嵌套,倒是绘的图不停的闪。

Invalidate让客户区处于可以重画的状态,而UpdateWindow开始重画,但是它先判断客户区是否为空,不空UpdateWindow不执行,为空才执行重画。

Invalidat最后也是调用InvalidatRect,在windows API里只有InvalidatRect的。

窗口刷新 Invalidate UpdateWindow RedrawWindow相关推荐

  1. Windows窗口刷新机制详解

    1.Windows的窗口刷新管理 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前窗口从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序 ...

  2. VC窗口刷新InvalidateRect和…

    学习了 原文地址:VC窗口刷新InvalidateRect和UpdateWindow 作者:玩世不恭 首先说说WM_PAINT这个重要的消息: The WM_PAINT message is gene ...

  3. Java|窗口刷新、图片自动播放问题

    之前窗口刷新图片时出现了一点小问题,基本状况是:打开图片后要运用方法setBackGround()加上循环实现图片自动播放的功能,但是图片一直没有刷新,一直停在第一张图片,但是在我发了论坛之后一直没有 ...

  4. 关闭子窗口刷新父窗口

    以下这段代码是为了弹出一个窗口,window.showModalDialog这个是弹出窗体的地方,当执行到的时候它后面的代码就不执行了,当把弹出的窗体关闭将会执行后面的location.reload( ...

  5. layui table reload post请求_如何实现在Layui框架中完成父窗口刷新(更新)

    最近有个项目使用Layui框架进行后端系统的界面搭建,其中Layui框架中的Layer组件在项目中会用得非常多.且有些功能会遇到子窗口完成数据的提交后,进行关闭同时会刷新父窗口的数据,所以此文章分享一 ...

  6. 主窗口刷新,子窗口闪烁

    问题:主窗口刷新,子窗口闪烁 解决方案:主窗口创建时,传WS_CLIPCHILDREN 转载于:https://www.cnblogs.com/chunyou128/p/3739193.html

  7. EGE绘图之二 窗口刷新

    EGE专栏:EGE专栏 上一篇:EGE绘图之一 绘图讲解 下一篇:EGE绘图之三 动画 EGE绘图之二 窗口刷新 目录 一.EGE的窗口刷新 1. EGE窗口刷新流程 2. 渲染模式 2.1 自动渲染 ...

  8. 【转】VC窗口刷新InvalidateRect和UpdateWindow RedrawWindow

    首先说说WM_PAINT 这个重要的消息: The WM_PAINT message is generated by the system and should not be sent by an a ...

  9. VC++ 关于窗口刷新的几个函数InvalidateRect、UpdateWindow、RedrawWindow

    在前面写了那么多自绘控件,有必要对这几个接口做下声明解释: 这几个接口都是对执行窗体重绘的消息,那么什么时候才会发生重绘窗口的消息?答案是:当窗体需要更新内容或是重绘外观背景的时候,应用程序通常会发送 ...

最新文章

  1. Linux 下 svn 的使用
  2. 我诞生了!祝贺我吧。
  3. AA065VD数据线连接错位的现象及分析总结
  4. linux7.3系统u盘制作,制作centos7U盘启动盘
  5. (摘)Excel 2007查询操作中的函数应用
  6. Codeforces Round #573 (Div. 2)(ABCD)
  7. 2013年第8周日元宵节
  8. atitit 提升数据库死锁处理总结
  9. SQL注入漏洞与参数化查询
  10. 联想ideaPad Z470安装黑苹果与Win双系统教程
  11. 如何将通讯录批量转换为vcf格式导入手机,苹果手机如何批量删除通讯录?
  12. python的100道数学题_python经典例题100道
  13. 诗词格律[7] 诗词的唱和
  14. 消息中间件-Activemq之Master-Slaver
  15. android 闪屏图片,Android的闪屏图像尺寸,以适应所有设备Android的闪屏图像尺寸,以适应所有设备(Andro...
  16. python计算复数模_python 模拟casio复数计算器【施工中】
  17. 案例6-1.3 哥尼斯堡的“七桥问题”
  18. 论文的系统 排版软件Latex
  19. Codeforces 833D Red-Black Cobweb 边分治
  20. 二维码自动扫描完整版

热门文章

  1. html修改按钮背景颜色,html鼠标悬浮在按钮上,让按钮背景变色
  2. 新建maven项目更改 web版本
  3. 桐花万里python路-基础篇-01-历史及进制
  4. 前端性能优化:使用Data URI代替图片SRC
  5. poj3216 Prime Path(BFS)
  6. 洛谷 P2818 天使的起誓
  7. LInux下装jdk
  8. 台式机 双显卡切换实战
  9. 全排列(递归与非递归实现)
  10. strcpy_s与strcpy对照