Invalidate、RedrawWindow与UpdateWindow的差别
一:什么时候才会发生重绘窗体的消息?
当须要更新或又一次绘制窗体的外观时,应用程序就会发送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().
/************************************************************************************/
Invalidate在消息队列中增加一条WM_PAINT消息,其无效区为整个客户区。
UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多仅仅有一条)的无效区。
效果非常明显,当调用Invalidate之后。屏幕不一定马上更新,由于WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使WM_PAINT消息马上运行的,绕过了消息队列。
假设调用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、RedrawWindow与UpdateWindow的差别的更多相关文章
- Invalidate、RedrawWindow与UpdateWindow
Invalidate.RedrawWindow与UpdateWindow的区别 Invalidate()是强制系统进行重画,但是不一定就马上进行重画.因为Invalidate()只是通知系统,此 时的 ...
- (转)Invalidate、RedrawWindow与UpdateWindow的区别
一:什么时候才会发生重绘窗口的消息? 当需要更新或重新绘制窗口的外观时,应用程序就会发送WM_PAINT消息.对窗口进行重新绘制. 二:Invalidate() -- RedrawWindow() ...
- Invalidate() InvalidateRect() 与 UpdateWindow()
按引:Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区.而UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最 ...
- MFC重绘函数:InvalidateRect(), Invalidate()和UpdateWindow()
1. 重绘消息 当需要更新或者重绘窗口时,一般系统会发出两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化) WM_NCPAINT系统会自己搞定 WM_PAINT消 ...
- WM_PAINT消息在窗口重绘的时候产生,那什么时候窗口会重绘(异步工作方式效率高、灵活性强,还有UpdateWindow和RedrawWindow帮忙)
Q:wm_paint消息在窗口重绘的时候产生,那什么时候窗口会重绘?? A: 严格地说,只有当收到WM_PAINT消息后窗口会重绘 但是引起这个消息的事件有很多, 比如:1.首次创建 2.移动 3.改 ...
- MFC截图和界面刷新相关问题
问题描写叙述: 就是首先用CDC来截图,保存图片的路径通过dlg窗体来手动设置并传入.但是截下来的图片就会连带那个对话框也截图下来. 就是这样.我想截后面那个图.前面这 ...
- [转]Windows的窗口刷新机制
1.Windows的窗口刷新管理 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前窗口从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序 ...
- MFC常见问题解惑
MFC类的分类 1 Root: CObject : CObject2 Application Architecture Classes: CWinApp/CFrameWnd/... 3 Window, ...
- VC一些经验系列: 《分享泄漏检测工具:内存、DC、GDI、Handle... 》
分享下自己工作中用到的一些用于泄漏检测的工具 后面的是DC的一些定义和注意事项.(不喜勿看) //=================================================== ...
随机推荐
- 【luogu2574】xor的艺术
一道无聊的线段树题,写着玩玩而已…… #include<bits/stdc++.h> #define N 1000010 #define lson (o<<1) #define ...
- 【计算机网络】wireshark抓包分析2
在分析1中,大概的看到了一个包中的信息.这里,看看这些包究竟在做什么 这是我的电脑跟某个网站交互的前4个包. 其中前三个包可以明显看出是TCP的三次握手. 那么,问题来了: 为什么第三个包的长度比前两 ...
- k8s的service
1.service简介 本节开始学习 Service.我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 c ...
- 记录一次统计首页MYSQL非常慢的解决过程
select resource_size_int from t_resource_info where release_status in (1,3) and res_type in (1,2,4,5 ...
- JDBC连接池(数据源)
自定义连接池:用装饰设计模式将原连接的close方法改造成将连接还回数据源:装饰设计模式:http://www.cnblogs.com/tongxuping/p/6832518.html: 开源数据库 ...
- python 去掉所有空白字符【解决】
今天用python从access数据库读取内容,组合成sql语句时,空白字符把我给搞疯了.... 所幸找到了一个好办法: ''.join(s.split())
- CF A.Mishka and Contest【双指针/模拟】
[链接]:CF/4892 [题意]: 一个人解决n个问题,这个问题的值比k小, 每次只能解决最左边的或者最右边的问题 解决了就消失了.问这个人能解决多少个问题. [代码]: #include<b ...
- Problem C: 机器翻译【stl-队列】
Problem C: 机器翻译 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 54 Solved: 27[Submit][Status][Web Bo ...
- tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)
基本概念 给定无向连通图G = (V, E)割点:对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点割边(桥)若对于e∈E,从图中删去边e之后,G分 ...
- 51nod 1129 字符串最大值
首先我们可以想到的是,既然求的是前缀的长度,就意味着一定是从1开始的,那么我们可以直接用下 标表示每一个前缀.但是可能存在几个前缀互相包含的情况,比如:abababa我们可以看见的是aba中包含着ab ...