Invalidate/InvalidateRect/UpdateWindow/RedrawWindow区别与联系

窗口刷新的几个函数:Invalidate UpdateWindow RedrawWindow 窗口刷新的几个函数:Invalidate UpdateWindow RedrawWindow 阅读详情

      当窗口发生重绘时,应用程序会接收到WM_PAINT消息,从而调用ONPaint()函数,当程序中调用以下几个函数时会发送WM_PAINT消息。

在讲解之前有一点知识需要明白:即当窗口有效时,那么我们是不能对窗口进行绘制,当窗口无效时,我们才能向窗口进行重画操作。

1. void Invalidate( BOOL bErase = TRUE )

    该函数的作用是使整个窗口的客户区无效,使客户区无效就意味着对客户区需要重绘,从而对应用程序发送WM_PAINT消息。这就导致程序强制应用程序进行重画,但不一定是马上进行重画,该消息是利用PostMessage()来传递WM_PAINT消息到消息队列中,当执行到该WM_PAINT消息时,才会对客户区进行重画。

    在该函数中,参数默认为TRUE,当参数为TRUE时,重绘区域将会重画,否者,背景将保持不变。

2. BOOL InvalidateRect(HWND hWnd,//需要重绘的窗口的句柄

       LPCRECT lpRect,//需要重绘的矩形区域

                       BOOL bErase = TRUE)//重绘矩形的方式

需要更新窗口时可以利用Invalidate()重绘整个窗口,但是该函数需要的计算量很大,会导致屏幕出现闪烁,为了防止这种情况,可以使用InvalidateRect来代替Invalidate,因为这个函数仅重绘这个窗口中的小矩型,计算量小的多。

    在该函数中,最后一个参数bErase为TRUE时,会向窗体发送一个WM_ERASEBKGND消息,这个消息会使背景进行重绘,TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景色。

3.UpdateWindows()

    UpdateWindows(),当调用这个函数的时候,会立即让当前的窗口失效,然后对整个窗口立即进行重绘。UpdateWindows()函数调用的时候直接将OnPaint调用到目标窗口,使目标窗口立即进行重绘。当然在发送之前判断GetUpdateRect(hWnd,NULL,TRUE)看有无可绘制的客户区域,如果没有,则不发送WM_PAINT。

      与Invalidate的区别: UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。

4.RedrawWindow()

    则是具有Invalidate()和UpdateWindow()的双特性。声明窗口的状态为无效,并立即更新窗口,立即调用WM_PAINT消息处理。


注意:UpdateData()函数不是用于刷新窗口,而是用于更新数据。参数为FALSE时,将界面上控件绑定的变量的数据导到控件内,参数为TRUE时,导入方向则相反。



深入解析窗口刷新三剑客:Invalidate、UpdateWindow与RedrawWindow的实战应用 本文深入解析Windows桌面应用开发中窗口刷新的核心机制,重点剖析Invalidate、UpdateWindow与RedrawWindow这“三剑客”的实战应用。通过对比三者异步标记、立即触发与全能执行的不同特性,结合WM_PAINT消息处理流程,详细阐述如何根据性能优化、界面响应和闪烁控制等需求选择合适的刷新策略,并提供了避免递归调用和优化无效区域管理的最佳实践。 阅读详情

相关推荐

InvalidateRect()、UpdateWindow()、RedrawWindow()区别

先看一段移动图片的程序:       绘图工作都在ReDraw()中   响应MouseMove  改变图片的位置,鼠标移动后需要重绘窗口   实验一: ReDraw()在MouseMove函数中调用 OnMouseMove(UINT nFlags, CPoint

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 2万+

VC中 InvalidateRect、RedrawWindow和UpdateWindow的区别

转载自:http://blog.sina.com.cn/s/blog_43c198e90100sia9.html InvalidateRect是将客户区标记为无效,并产生WM_PAINT消息,Windows会将WM_PAINT消息放入队列,等待窗口过程的处理,然后操作系统将WM_PAINT当作是低优先级消息,如果后面有其他的动作要处理,则可能会出现空白的区域需要等待一段时间才被刷新。

jzjwonderful的专栏 2413

InvalidateRect,Invalidate,UpdateWindow区别

在编程的时候经常把UpdateData、Invalidate、InvalidateRect和UpdateWindow四个函数混淆,在这里将简单介绍它们的区别

Invalidate和UpdateWindow的区别

Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。 UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多只有一条)的无效区。 效果很明显,当调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不

旅途 2182

「分治法」最近点对距离问题

一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方)

Laok0413的博客 9656

SAP 物料账前期没有运行的解决方法

If you use the actual costing (material ledger), you must have completely closed all period-end closing operations in the actual costing for the penultimate period prior to the period shift. Use the '...

含笑饮砒霜死后更嚣张 3316

C#调用windows API桌面绘制半透明图形,清除绘制内容

  之前做过一个截图工具,通过winform做的遮罩层,这段时间想要通过绘制遮罩层的方法来取代winform,第一步就是在桌面半透图形的绘制了。 这里记录下实现代码,只要包括两部分内容。 1.在桌面绘制半透明图形。 2.清楚桌面绘制的内容。 /// <summary> /// 获取桌面的句柄 /// </summary> ...

dianjiankuang9616的博客 572

基于CPCC_S_TASK_LIST_MAINTAIN的工艺路线组件批量分配实战与避坑指南

本文详细解析了SAP PP模块中基于CPCC_S_TASK_LIST_MAINTAIN函数实现工艺路线组件批量分配的实战技巧与避坑指南。针对批量分配的核心挑战,提供了参数配置、BAPI协同使用、Excel导入等解决方案,并分享了大容量数据处理优化经验,帮助用户高效完成工艺路线组件分配任务。

weixin_33563728的博客 306

MFC中CMainFrame->RedrawWindow有什么用

MFC中CMainFrame->RedrawWindow有什么用

Ausma的博客 653

TC397 EB配置ADC软件触发:从零实现周期采样与中断处理

本文详细介绍了如何在Infineon AURIX TC397芯片上使用EB Tresos工具配置ADC软件触发,实现周期采样与中断处理。通过硬件连接、EB模块配置、代码初始化及数据处理的全流程解析,帮助开发者快速掌握ADC软件触发技术,提升嵌入式系统开发效率。

root9的博客 231

LabVIEW电压信号采集系统:从零搭建到科研实战

本文详细介绍了如何从零开始搭建一个基于LabVIEW的电压信号采集系统。内容涵盖硬件选型(如NI USB-6002数据采集卡)、软件环境配置、核心程序开发(包括多通道同步采集、数据自动保存)以及高级功能优化。系统支持自定义采样率与时长,并提供了完整的LabVIEW程序框图和配套的Python数据分析脚本,旨在帮助科研人员和工程师快速构建稳定、高效的专属数据采集方案,提升实验自动化水平。

gold8的专栏 461

RedrawWindow(NULL, NULL, RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW|RDW_ALLCHILDREN);

CWnd::RedrawWindow BOOL RedrawWindow(      LPCRECT lpRectUpdate = NULL,      CRgn* prgnUpdate = NULL,      UINT flags = RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE      ); 返回值:如果窗口被成功地重画,则返回非零值;否

cwbo_win的专栏 2103

深入解析:如何基于开源p-net快速开发Profinet从站服务

开源p-net协议栈为工业设备开发者打开了通往Profinet世界的大门。随着工业互联网的发展,软协议栈方案将在边缘计算领域展现更大潜力。该文章完整实现了PROFINET从站的核心功能,可直接作为产品开发的基础框架。实际部署时需根据具体硬件平台调整网络驱动和实时性配置。

极地星辰 3881

UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow

UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindowInvalidate和UpdateWindow的区别按引:Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。而UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多只有一条)的无效区。效果很明显,调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用Up

pepehai的专栏 946

组合预测模型 | LSTM-XGBoost长短期记忆神经网络结合极限梯度提升树时间序列预测(Matlab程序)

组合预测模型 | LSTM-XGBoost长短期记忆神经网络结合极限梯度提升树时间序列预测(Matlab完整程序)

前程算法屋的博客 2180

微信小程序 “net::ERR_CONNECTION_REFUSED” 报错大揭秘与破解之道

在微信小程序开发与运行过程中,“net::ERR_CONNECTION_REFUSED” 报错是开发者常遇难题。该错误意味着小程序与服务器连接建立失败,会导致功能无法使用、数据加载异常等问题,严重影响用户体验和业务运转。本文系统剖析此错误,从网络环境不佳、服务器异常、小程序配置有误等常见触发场景入手,提供网络、服务器、配置、代码等多维度排查步骤,给出针对性解决策略,如修复网络、处理服务器故障、修正配置与代码错误,还提出开发与运维阶段的预防措施,助力开发者高效解决该报错问题。

邓邓子的博客 6134

UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow的比较

Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。而UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多只有一条)的无效区。效果很明显,调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列

一点通的专栏 909

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

深入解析窗口刷新三剑客:Invalidate、UpdateWindow与RedrawWindow的实战差异

本文深入解析Windows编程中窗口刷新的三个关键函数:Invalidate、UpdateWindow和RedrawWindow的实战差异。通过WM_PAINT消息机制分析,详细比较了各函数的工作原理、适用场景及性能影响,帮助开发者优化界面刷新策略,解决常见闪烁和效率问题。

weixin_26757925的博客 365

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

VC窗口刷新InvalidateRect和UpdateWindow

首先说说WM_PAINT这个重要的消息:  The WM_PAINT message is generated by the system and should not be sent by an application.The system sends this message when there are no other messages in the application's message queue  也就是说WM_PAINT消息是由系统产生,非要等应用程序的消息队列为空时才发送WM_PAIN

happinies的专栏 797
上一篇: VC中获取字符串长度的四种类型
下一篇: 文件操作一:基于C语言的文件操作
self_mind
博客等级 码龄11年 32粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值