函数原型:
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()函数的作用详细解释相关推荐

  1. Python之pandas:pandas.set_option函数的参数详细解释

    Python之pandas:pandas.set_option函数的参数详细解释 目录 pandas.set_option函数的参数解释 函数API:pandas.set_option pandas. ...

  2. im2col函数实现超级详细解释

    前言 阅读<深度学习入门:基于python的理论与实现>,其中在实现CNN的章节中,提到为了CNN的快速计算需要将输入数据展开是以适合滤波器(权重),对于输入数据,将应用滤波器的区域(3维 ...

  3. windows系统中的dll的作用详细解释

    什么是.DLL文件? DLL 是一个包含可由多个程序同时使用的代码和数据的库.例如,在 Windows 操作系统中,Comdlg32 DLL 执行与对话框有关的常见函数.因此,每个程序都可以使用该 D ...

  4. matlab imcrop 对应python函数_Python精讲Numpy基础,大牛笔记详细解释

    总认为Numpy是渣渣,直到深入接触以后才知道功能这么强大.堪比Matlab啊.果然是人生苦短,我用Python.所以本文作为一个记录&笔记,文章内容大多数取自网络以&官网快速入门等, ...

  5. 【printf】sprintf字符串转数值、数值转字符,拼接字符,函数详细解释 Printf 打印数值...

    1.数值转成字符: sprintf个函数,如: sprintf(s, "%d", 123); //产生"123" 2.字符串转成数值: while(*BandR ...

  6. 详细解释sprintf 函数(转)

    sprintf 函数详细解释(转)   sprintf() 格式化输出函数 功能: 函数sprintf()用来作格式化的输出. 用法: 此函数调用方式为int sprintf(char *string ...

  7. sklearn之pipeline:sklearn.pipeline函数使用及其参数解释之详细攻略

    sklearn之pipeline:sklearn.pipeline函数使用及其参数解释之详细攻略 目录 sklearn.pipeline函数使用及其参数解释 sklearn.pipeline函数使用及 ...

  8. c语言中signal函数详细解释说明

    c语言中signal函数详细解释说明     对于 信号处理函数 位于 <signal.h> 中. void ( *signal( int sig, void (* handler)( i ...

  9. 双离合档把上按钮作用_求双离合档位详细解释

    求双离合档位详细解释以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 双离合变速器是自动变速器的一种,主要档位有P.R.N ...

最新文章

  1. 深度优先搜索和广度优先搜索的比较与分析
  2. Linux内核的同步机制---自旋锁
  3. 《狂人日记》金句摘抄(一)
  4. 记一次ubuntu误操作导致无法用sudo
  5. AI 垃圾分类指日可待?
  6. 安卓手机通电自动开机,自动执行脚本,断电关机,连接电源手机自动开机,断电关机
  7. Java实习日记(7)
  8. dw网页制作入学教程_网站制作DW教程:Dreamweaver CC零基础入门视频课程
  9. Python 日历模块 calendar
  10. [error]: Found option without preceding group in config file ....\my.ini at line:1
  11. 360cdn能挡住cc攻击_人人用得起的CDN加速服务,可防御CC攻击
  12. 【Redis笔记】一起学习Redis | 如何利用Redis实现一个分布式锁?
  13. office2016的word打开程序之后显示需要修复问题解决解决
  14. Youtube视频推荐算法:从10页论文到4页论文的变迁
  15. 细数SuperComputer最新排名和常见Benchmark类型
  16. torchaudio音频基础知识学习
  17. 你肯定不知道,一个历经了3万2千年的开源项目竟然是……
  18. android去除root,RE管理器root权限彻底清除教程[图]
  19. 信号塔是服务器吗,信号塔对于我们的用途
  20. 浅析SaaS的渠道推广

热门文章

  1. centos7时间同步
  2. 2021-09-08 设置电脑网络唤醒
  3. AI给老照片注入新生命,8款工具让怀旧变得更美好
  4. 智能安全配电装置伙房食堂中的应用
  5. Linux的优缺点,Linux与windows的区别
  6. 醉酒旅客欲在高铁吸烟遭劝阻 辱骂工作人员和乘警
  7. vue脚手架工程搭建
  8. 一、java项目常用工具类之加密工具类
  9. 未来什么语言最流行?就是它!
  10. Springboot设计思路