vc初步之——— WM_Paint 消息详解

C++程序编程中的WM_PAINT、WM_ERASEBKGND、InvalidateRect、UpdateWindow、BeginPaint和EndPaint详解 Windows编程中的WM_PAINT、WM_ERASEBKGND、InvalidateRect、UpdateWindow、BeginPaint和EndPaint详解。 阅读详情
 

1. 系统何时发送WM_PAINT消息?

   系统会在多个不同的时机发送 WM_PAINT 消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个

窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由系统管理的,应用只是被动地接收该消息,在消息处理

函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口显示的数据改变的时候,这一

般是通过 InvalidateRect 和 InvalidateRgn 函数来完成的。

    InvalidateRect 和 InvalidateRgn把指定的区域加到窗口的 Update Region 中,当应用的消息队列没有其他

消息时,如果窗口的 Update Region 不为空时,系统就会自动产生 WM_PAINT 消息。

    系统为什么不在调用 Invalidate 时发送 WM_PAINT 消息呢?又为什么非要等应用消息队列为空时才发送

WM_PAINT 消息呢?这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽可能地推后做。

    不过这样也有利于提高绘制的效率:两个 WM_PAINT 消息之间通过 InvalidateRect 和InvaliateRgn 使之失效

的区域就会被累加起来,然后在一个 WM_PAINT 消息中一次得到 更新,不仅能避免多次重复地更新同一区域,也优化了

应用的更新操作。

    这种通过 InvalidateRect 和 InvalidateRgn 来使窗口区域无效,依赖于系统在合适的时机发送 WM_PAINT

消息的机 制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送 WM_PAINT 消息之间是有延迟的;有时候

这种延迟并不是我们希望的,这时我们当然可以在无效化窗口区域后利用 SendMessage  发送一条 WM_PAINT消息来强

制立即重画,但不如使用 Windows GDI 为我们提供的更方便和强大的函数: UpdateWindow 和 RedrawWindow。

   UpdateWindow 会检查窗口的 Update Region,当其不为空时才发送 WM_PAINT 消息; RedrawWindow 则给我

们更多的控制:是否重画非客户区和背景,是否总是发送 WM_PAINT 消息而不管 Update Region 是否为空等。


2. BeginPaint

   BeginPaint 和 WM_PAINT 消息紧密相关。试一试在 WM_PAINT 处理函数中不写 BeginPaint 会怎样?程序会像

进入了一个死循环一样达到惊人的CPU占用率,你会发现程序总在处理一个接 一个的 WM_PAINT 消息。这是因为在通常情

况下,当应用收到 WM_PAINT 消息时,窗口的 Update Region 都是非空的(如果为空就不需要发送WM_PAINT 消息

了), BeginPaint 的一个作用就是把该 Update Region 置为空,这样如果不调用 BeginPaint,窗口的

Update Region 就一直不为空,如前所述,系统就会一直发送 WM_PAINT 消息。

    BeginPaint 和 WM_ERASEBKGND 消息也有关系。当窗口的 Update Region 被标志为需要擦除背景时,

BeginPaint 会发送 WM_ERASEBKGND 消息来重画背景,同时在其返回信息里有一个标志表明窗口背景是否被重画过。

    当我们用 InvalidateRect 和 InvalidateRgn 来把指定区域加到 Update Region 中时,可以设置该区域是否

需要被擦除背景,这样下一个 BeginPaint 就知道是否需要发送 WM_ERASEBKGND 消息了。

    另外要注意的一点是,BeginPaint 只能在 WM_PAINT 处理函数中使用。

补充几点:

1.WM_Paint 是一个被动消息,不能通过普通的方法简单的 sendmessage WM_paint 了事

这是不行的;但通过消息由程序员引发不是不可能;通过几个特殊的常数可以做到,不过要到delphi下找

2.sendmessage 可以将消息发送到消息队列;但windows会自动判断是否存在无效的画图区域;

如果存在无效的画图区域,则可能会重画,反之则弃用该消息.

3.可以使用 InvalidateRect 等几个APi将屏幕上任意一个个矩形区域设置为无效区域,在UpdateWindow后调用后,windows会自动查找是否存在无效,并重画,该矩形区域;

合宙Air780EP速连OneNET:AT+MQTT应用指南 本文详细讲解了合宙Air780EP使用AT指令通过MQTT接入OneNET的过程。 阅读详情

相关推荐

告别手动调参!PSCAD 4.2的Multiple-Run功能,5分钟搞定交流故障批量仿真

本文详细介绍了PSCAD 4.2的Multiple-Run功能如何高效处理交流故障批量仿真,告别传统手动调参的低效模式。通过五步配置法,工程师可在5分钟内完成数百次参数组合的仿真,显著提升电力系统分析效率。文章还包含工业级应用案例和高级调试技巧,助力实现故障仿真的自动化与智能化。

weixin_42552716的博客 276

窗口刷新问题(WM_PAINT、BeginPaint、EndPaint的说明)

在Windows API编程中,WM_PAINT是Windows窗口的一个重要消息,应用程序就是通过响应这个消息来完成窗口的绘制。   The WM_PAINT message is generated by the system and should not be sent by an application.The system sends this message when there a

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

过压保护电路(OVP)

作者:AirCity 2020.2.4 Aircity007@sina.com 本文所有权归作者Aircity所有 1 示例一 当VBUS=5V时,各点电压电流如图所示,Q1接近截止,输出信号是5V。 当VBUS=5.4V开始,输出信号开始下降,直到VBUS=6.1V,输出信号降低为0.6V。 下面是实测波形,这个电路,输出信号的电压不会超过5.4V,这个输出信号可用于电源的控制信号。 2 ...

AirCity123的博客 3万+

[WGDI]WM_PAINT 消息处理

WM_PAINT 消息处理;防闪屏双缓冲;背景前景绘制;半透明和透明应用。

ZHWEHA 2070

鸿蒙日历组件进阶:教你打造个性化日程管理界面(支持月份切换)

本文深入探讨了鸿蒙应用开发中自定义日历组件的构建方法。通过详解基于Grid的布局设计、核心日期算法、月份切换逻辑以及事件管理集成,指导开发者打造支持个性化日程管理的高性能日历界面,提升应用交互体验。

weixin_29207149的博客 66

【GAN】pytorch-CycleGAN-and-pix2pix开源项目训练自定义数据集

Github:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 一、概念简介 图像转换:将一张图片转换为不同风格的图片,如将一张灰度图变成彩色图,素描图换成实物图。 pix2pix:需要成对的数据集,两个不同域的图像一一对应。 CycleGAN:不需要成对的数据集,只用两个不同域(domain)的图像集合X和Y,两个集合中的图像不是一一对应的。 二、训练pix2pix模型 2.1 combine_A_and_B datasets/combin

See_Star的博客 4756

C#截获其它窗口的WM_PAINT 消息

在C#底下如何截获其它窗口的WM_PAINT 消息啊? 自己窗口可以这样截获 protected override void WndProc( ref Message m ) { switch(m.Msg) { case WM_PAINT: { } }

u011555996的博客 776

Windows下Cppcheck静态测试全流程:从安装到生成HTML报告的避坑指南

本文详细介绍了在Windows平台下使用Cppcheck进行静态代码分析的全流程,包括环境搭建、插件配置、自动化脚本编写及HTML报告生成。重点解析了MISRA插件集成、常见问题排查以及性能优化技巧,帮助C/C++开发者高效提升代码质量。文章特别针对Windows环境下的路径处理、空格问题等细节提供了实用解决方案。

weixin_29313547的博客 200

vc中WM_PAINT消息是什么,有什么作用,什么是时候产生

当窗口需要重绘时,系统会为窗口发送这个消息,比如一个窗口被另一个窗口挡住、一个窗口被移走而下面的窗口露出来,还有一个窗口从最小化中恢复、改变大小,移动位置。。。。等等。 程序也可以显示的调用Invalidate等函数要求窗口重绘,那么也会触发WM_PAINT。 当然操作系统不知道你的窗口上将出现什么画面,那是应用程序应该干的事情,那么这个消息的作用就是告诉应用程序,你该重画你的窗口了。CWnd

高调做事,低调做人 1742

毕设-YOLOv8-OBB 实现自有数据集缺陷旋转检测全过程记录

这次项目让我深入理解了 YOLOv8-OBB 的原理和使用流程。步骤内容工具数据标注制作倾斜缺陷样本格式转换从 HBB 转换为 OBB模型训练使用 Ultralytics YOLOv8 OBBCLI 命令模型测试推理与结果可视化通过 OBB 模型,我的缺陷检测系统获得了更高的精度和鲁棒性。未来我打算继续优化数据增强方式,比如引入随机旋转、仿射变换等,让模型更适应不同角度的样本。

FJN110的博客 446

5、数据库基础概念与数据建模全解析

本文深入解析了数据库的基础概念,包括函数依赖、决定因素和多值依赖等关键依赖关系,同时探讨了数据建模的重要方法论,如IDEF1X、信息工程和陈方法。此外,还介绍了SQL Server管理工作室的图表功能,帮助用户进行数据库的可视化设计。通过本文,读者将掌握数据库设计的核心知识,为构建高效、可扩展的数据库系统奠定基础。

81

WM_PAINT与其响应函数OnPaint(VC++)

 OnPaint()是CWnd的类成员,负责响应WM_PAINT消息,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。OnDraw()是CVIEW的成员函数,没有响应消息的功能.当视图 变得无效时(包括大小的改变,移动,被遮盖等等),Windows发送WM_PAINT消息。该视图的OnPaint 处理函数通过创建CPaintDC类的DC对象来响应该消息并

ss19890125的专栏 3403

系规备考论文:论IT服务规划设计

系规备考论文:论IT服务规划设计

liuxu324的博客 1144

VC中的所有WM消息

 windows消息WM_ WM_NULL =$0000; WM_CREATE =$0001; 应用程序创建一个窗口 WM_DESTROY =$0002; 一个窗口被销毁 WM_MOVE =$0003; 移动一个窗口  WM_SIZE =$0005; 改变一个窗口的大小 WM_ACTIVATE = $

跟健哥出去走走 8793

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

WM_CREATE与 WM_PAINT以及WM_INITDIALOG

程序如: switch(iMessage) {     case WM_CREATE:        ...         return 0;     case WM_PAINT:          ......          return 0;     case WM_SIZE:          ......          return 0;     defa

chunlovenan的专栏 3835

IEM模型,地表粗糙度模拟

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

【VC】WM消息列表(全)

在Windows操作中,所有的操作都是基于消息的。我们编写的程序,也是这个道理。同样,我们也可能查看事件发生时,到底触发了什么样的消息。 消息名 消息值 说明 WM_CREATE 0x0001 应用程序创建一个窗口 WM_D...

dianwu9730的博客 724

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

深度探索WM_PAINT消息

<br /><br />【引言】:这是以前在作VC/EVC开发时候遇到的一个郁闷的问题的思考,刚好最近在VC#开发时候遇到了类似的问题,因此就总结出来,期望能够给遇到同样问题的开发者一些帮助和提示。<br /> <br />问题缘起<br />       半年前,在作Mobile GPS项目(移动手持设备上的GPS/GIS项目)的时候,为了实现PDA上的地图下载功能,我们将GIS地图数据转化为XML文件,在经过相关技术的优化终于做到了将XML的地图解析并绘制到PDA屏幕上。但是问题出现了:当在响应一个绘制

fangfang的专栏 800

VC设置CEdit控件背景透明、文字背景也透明

开发环境:VC6, a dialog based MFC application. 主界面: 为对话框添加WM_CTLCOLOR消息响应函数: HBRUSH CDDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlCo

JoeBlackZQQ的专栏 5030

vc中调用WM_PAINT消息

转自:新浪博客 作者:风铃 1. WM_PAINT消息根本就不用SendMessage来实现,当窗口出现无效区时,系统会自己发送这个消息,而用Invalidate()或者InvalidateRect就会产生无效区而发送WM_PAINT    void Invalidate( BOOL bErase = TRUE );   该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,

SurfingAnt的专栏 1130

VC中的消息

VC中的消息        消息,就是Windows向应用程序发出的通知。事件,就是你对硬件设备的操作。例如,当你单击鼠标、敲击键盘等,这本身就是一个事件的发生,Windows会捕捉到你操作硬件的这些事件,然后会产生对应的消息,并将消息放入消息队列,最后应用程序从消息队列按顺序取走属于自己的消息,将消息和对应函数联系起来。这就是面向对象编程的基本原理。 消息本身是作为一个记录传递给应用程

水上漂的专栏 1440

VC中何时触发WM_PAINT

当窗口需要重绘时,系统会为窗口发送这个消息,比如一个窗口被另一个窗口挡住、一个窗口被移走而下面的窗口露出来,还有一个窗口从最小化中恢复、改变大小,移动位置。。。。等等。 程序也可以显示的调用Invalidate等函数要求窗口重绘,那么也会触发WM_PAINT。

sunnyweetlulu的专栏 1171

在VC6.0中添加WM_MOUSELEAVE消息以及消息响应

在VC6.0中默认是没有WM_MOUSELEAVE消息的,当然在高版本里面是有。在网上找了实现的方法,下面将VC6.0里面实现WM_MOUSELEAVE消息的方法共享下,如果有好的方法或者有不对的地方也可以共享下,供大家相互学习: 一、在头文件中添加消息响应函数 afx_msg void OnMouseLeave();  二、在CPP文件的消息映射中添加消息 BEGIN_MESSAGE_M

tanyufeng_521的专栏 1603

0.VC(ui)-InvalidateRect 和validateRect 和wm_paint

今天复习了下windows程序设计五第9章节,想到了个问题: case WM_PAINT : InvalidateRect (hwnd, &rect, TRUE) ; hdc = BeginPaint (hw

hgy413的专栏 2307

mfc,WM_CTLCOLOR,WM_PAINT

1. WM_ERASEBKGND 绘制背景 WM_PAINT 绘制前景,就是一般的绘图 WM_CTLCOLOR 确切的说对于edit 其实是 WM_CTLCOLOREDIT ,反射消息,表示子控件绘制之前通知父窗口“我要绘制了,告诉我要绘制什么颜色,否则我就用默认的”。 1.2.3 没分别,都要调用 这3个消息。因为这3个消息是关联的默认的 MoveWindow,RedrawWindo

xiao190128的专栏 2973

Win32项目中的WM_CREATE消息何时被调用的

(本文转载自http://bbs.ednchina.com/BLOG_ARTICLE_3005454.HTM) (本文转载自https://www.it610.com/article/5309313.htm) VC中WM_CREATE、WM_INITDIALOG消息出现顺序及调用方式 wxleasyland@sina.com 2012.7 wxleasyland试验: VC建的标准...

newmaomao的博客 517
上一篇: vc文件详解(网上转载)
下一篇: vc初步之——— HDC,CDC,CClientDC的区别和联系是什么?
dadahacker
博客等级 码龄20年 78粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值