Invalidaterect()函数的作用详细解释
函数原型:
BOOLInvalidateRect(
HWND hWnd, // handle of window withchanged update region 窗口句柄。
CONST RECT *lpRect, // address ofrectangle coordinates rect结构体的指针。
BOOL bErase // erase-background flag 是否要发送WM_ERASEBKGND消息从而擦除原来的背景
);
这个函数的作用是,使得Client的一个矩形区域变得无效,rect结构体可以自己编辑,也可以使用GetClientRcet()来填充(这里的矩形大小Client的大小),最主要的是第三个参数,第三个参数决定了是否发送WM_ERASEBKGND消息,从而决定了是否擦除Client原有的图形。当然InvalidateRect发送WM_PAINT的形式是一种POST形式(即发送到程序消息队列),而不是像SendMessage一样直接让操作系统带着消息,调用WndProc。
当然如果想像SendMessage一样的。可以在后面接着使用UpdateWindow()直接绕过程序消息队列直接发送消息到WndProc函数,来重绘窗口。
分析一下下面的程序会更加的清晰:
case WM_RBUTTONDOWN:hdc = GetDC(hwnd);GetClientRect(hwnd, &rect);DrawText(hdc, TEXT("右键键被单机咯!"), 13, &rect, DT_VCENTER | DT_SINGLELINE);ReleaseDC(hwnd, hdc);InvalidateRect(hwnd, NULL, true);//UpdateWindow(hwnd);Sleep(1000);return 0;case WM_LBUTTONDOWN:hdc = GetDC(hwnd);GetClientRect(hwnd, &rect);DrawText(hdc, TEXT("左键被单机咯!"), 13, &rect, DT_CENTER | DT_SINGLELINE);ReleaseDC(hwnd, hdc);return 0;
这里为了能看到效果我使用了Sleep。在实际编程处理消息,不是在多线程时,这样的使用是十分愚蠢的,因为,消息循环的机制,如果你不快速的处理每一条消息。用户的体验将会受到很大的影响。比如,,无法操作,,这是最尴尬的。
1,这里如果UpdateWindow(hwnd)被注释掉的情况下,单机左键后,客户区屏幕打印出左键被单机咯,单机右键后打印出右键被单机咯。随后,调用了InvalidateRect()发送了WM_PAINT和WM_ERASEBKGND消息到消息队列,因为Invalidate第三个参数是true所以背景被重画,并且使rect的矩形范围失效。从而延迟1000ms后,处理WM_PAINT消息后,窗口上的左键…右键…..的字样都被清除。
2,如果UpdateWindow(hwnd) 没被注释掉。左键单机,右键单机,出现两条提示后,立即都消失(一般情况看不到右键点击的提示,而是直接擦除左键点击的提示的效果),为什么呢,因为UpdateWindow的作用,直接绕过队列,带到WndProc中去。所以直接重绘了。
3.如果InvalidateRect里面是false则结果将是没有任何效果。难道真的是没有效果吗。当然不是,实际上是有效果的。因为,这里InvalidateRect还是使得rect的区域失效了,只是不会擦除背景也就是原来打印在屏幕上的提示都不会被清除。而且还是发送了WM_PAINT消息,所以WM_PINT消息内的处理,会执行一次。
4.第三种情况,不就是使得区域无效,而且发送了WM_PAINT消息吗。实际上,就算不发送WM_PAINT消息,系统也会派送WM_PAINT消息。因为无效了。我又想到UpdateWindow不也是给WndPro带来了WM_PAINT消息吗?窗口不会重绘吗?答案是不会。因为窗口没有无效的区域,所以WM_PAINT内部的代码也没有执行。(为什么没有执行,原因是UpdateWindow内部检测了是否有无效区域,如果没有则不发送消息)。
Invalidaterect()函数的作用详细解释相关推荐
- Python之pandas:pandas.set_option函数的参数详细解释
Python之pandas:pandas.set_option函数的参数详细解释 目录 pandas.set_option函数的参数解释 函数API:pandas.set_option pandas. ...
- im2col函数实现超级详细解释
前言 阅读<深度学习入门:基于python的理论与实现>,其中在实现CNN的章节中,提到为了CNN的快速计算需要将输入数据展开是以适合滤波器(权重),对于输入数据,将应用滤波器的区域(3维 ...
- windows系统中的dll的作用详细解释
什么是.DLL文件? DLL 是一个包含可由多个程序同时使用的代码和数据的库.例如,在 Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数.因此,每个程序都可以使用该 D ...
- matlab imcrop 对应python函数_Python精讲Numpy基础,大牛笔记详细解释
总认为Numpy是渣渣,直到深入接触以后才知道功能这么强大.堪比Matlab啊.果然是人生苦短,我用Python.所以本文作为一个记录&笔记,文章内容大多数取自网络以&官网快速入门等, ...
- 【printf】sprintf字符串转数值、数值转字符,拼接字符,函数详细解释 Printf 打印数值...
1.数值转成字符: sprintf个函数,如: sprintf(s, "%d", 123); //产生"123" 2.字符串转成数值: while(*BandR ...
- 详细解释sprintf 函数(转)
sprintf 函数详细解释(转) sprintf() 格式化输出函数 功能: 函数sprintf()用来作格式化的输出. 用法: 此函数调用方式为int sprintf(char *string ...
- sklearn之pipeline:sklearn.pipeline函数使用及其参数解释之详细攻略
sklearn之pipeline:sklearn.pipeline函数使用及其参数解释之详细攻略 目录 sklearn.pipeline函数使用及其参数解释 sklearn.pipeline函数使用及 ...
- c语言中signal函数详细解释说明
c语言中signal函数详细解释说明 对于 信号处理函数 位于 <signal.h> 中. void ( *signal( int sig, void (* handler)( i ...
- 双离合档把上按钮作用_求双离合档位详细解释
求双离合档位详细解释以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 双离合变速器是自动变速器的一种,主要档位有P.R.N ...
最新文章
- 深度优先搜索和广度优先搜索的比较与分析
- Linux内核的同步机制---自旋锁
- 《狂人日记》金句摘抄(一)
- 记一次ubuntu误操作导致无法用sudo
- AI 垃圾分类指日可待?
- 安卓手机通电自动开机,自动执行脚本,断电关机,连接电源手机自动开机,断电关机
- Java实习日记(7)
- dw网页制作入学教程_网站制作DW教程:Dreamweaver CC零基础入门视频课程
- Python 日历模块 calendar
- [error]: Found option without preceding group in config file ....\my.ini at line:1
- 360cdn能挡住cc攻击_人人用得起的CDN加速服务,可防御CC攻击
- 【Redis笔记】一起学习Redis | 如何利用Redis实现一个分布式锁?
- office2016的word打开程序之后显示需要修复问题解决解决
- Youtube视频推荐算法:从10页论文到4页论文的变迁
- 细数SuperComputer最新排名和常见Benchmark类型
- torchaudio音频基础知识学习
- 你肯定不知道,一个历经了3万2千年的开源项目竟然是……
- android去除root,RE管理器root权限彻底清除教程[图]
- 信号塔是服务器吗,信号塔对于我们的用途
- 浅析SaaS的渠道推广