WM_PAINT详解

关于WM_ERASEBKGND和WM_PAINT的深刻理解 一直以来,对于WM_PAINT和WM_ERASEBKGND消息不是很清楚,从书上和网上找了很多资料,大体上有以下几点说法: 1>WM_PAINT先产生,WM_ERASEBKGND后产生 2.WM_PAINT产生后,在调用BeginPaint时 hdc = BeginPain 阅读详情

WM_PAINT详解

 
http://blog.sina.com.cn 2007年02月15日17:43 7456wg
 

WM_PAINT是Windows窗口系统中一条重要的消息,

应用程序通过处理该消息实现在窗口上的绘制工作。

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会自动查找是否存在无效,并重画,该矩形区

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

相关推荐

WM_PAINT 消息

对 MSDN 上 WM_PAINT 消息的详细翻译。 隶属于 Platform SDK Windows GDI 绘图消息。 后续会更新别消息-对MSDN的翻译。

WM_Paint消息详解

WM_PAINT是Windows窗口系统中一条重要的消息, 应用程序通过处理该消息实现在窗口上的绘制工作。 1. 系统何时发送WM_PAINT消息?    系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由系统管理的,应用只是被动地接收该消息,在消息处

tangyanzhi1111的专栏 878

【QML初学者文档】一问读懂QML基础开发(内附大量简单源码)

QML是Qt的一大特色,拥有强大的UI制作能力。但是想要学好QML,还需要一些细节和技巧的掌握。本篇文章将为你提供完整的QML知识体系,让你成为Qt的UI魔法师!

BenBierBa的博客 2万+

wm_paint 消息详细解析

WM_PAINT是Windows窗口系统中一条重要的消息, 应用程序通过处理该消息实现在窗口上的绘制工作。 1. 系统何时发送WM_PAINT消息?    系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由系统管理的,应用只是被动地接收该消息,在消息处

jnwangcan的专栏 1078

本地化部署dify,使用Database插件实现dify直连数据库报错No module named ‘MySQLdb‘解决方案

网上查阅各种资料,有说修改/dify-main/docker/volumes/sandbox/dependencies目录下的python-requirements.txt文件,添加了如下两行,试验后无效。,看到有人是其他报错,但是URI配置如下(在mysql后面加了pymysql),尝试后果真成功了。按照系统提示设置完数据库URI后保存出现错误。在工具市场查询Database,点击后进行授权。最后在该插件的项目地址获得灵感。

qiaoxu1989的博客 4333

pytorch中的wheel文件

whl 文件是 Python 的一个软件包分发格式,用于在 Python 中安装软件包。它是 Python Wheel 的缩写,也被称为 wheel 文件。这种文件格式旨在简化 Python 软件包的安装和分发。对于 PyTorch 而言,它提供了预编译的 .whl 文件,您可以通过 pip 安装这些文件来快速方便地安装 PyTorch。这些 .whl 文件是已经编译好的二进制分发文件,可以直接安装在您的 Python 环境中,而无需再进行编译。

bj_zhb的博客 3127

达内学习笔记——WM_PAINT消息

WM_PAINT消息 1 WM_PAINT的产生  由于窗口的互相覆盖等,产生需要重新绘制的区域,那么会产生WM_PAINT消息。 一般情况下,不直接发送WM_PAINT消息,通过声明需要绘制区域,来产生WM_PAINT消息。 例如,可以使用 InvalidateRect 声明一个需要重新绘制的区域。 sendMessage会自己去掉WM_PAINT. 2 WM_PAINT的注意点 2

yangpan011的博客 479

CRISPR筛选全流程指南:从文库构建到数据分析实战

功能基因组学研究需要高效解析基因型与表型的关联,高通量筛选技术是其中的关键工具。基于CRISPR系统的筛选方法通过大规模sgRNA文库扰动基因功能,结合慢病毒递送和测序分析,能够系统鉴定影响细胞增殖、耐药、病毒感染的候选基因。与RNAi或化学小分子筛选相比,CRISPR筛选具有覆盖全基因组、脱靶率低、信号清晰等优势,已广泛应用于药物靶点发现、合成致死和免疫治疗机制研究。本文围绕实验设计与操作中的核心要点展开,涵盖文库扩增、病毒滴度控制、MOI把握、筛选模式选择以及基于MAGeCK的sgRNA丰度分析,并针对

weixin_31188927的博客 287

els 窗口设置、WM_CREATE、WM_PAINT

/参数1如果加载系统光标,NULL、如果加载自定义光标,填写实列句柄,hInstance;//点叉系统依次产生WM_CLOSE,WM_DESTROY,WM_QUIT。caseWM_CREATE//窗口信息处理程序接受的第一个消息,也是回调函数处理的第一个消息(为WM_CREATE)。//窗口结构的最后的那个成员CS_HREDRAW|CS_VREDRAW,目的就是窗口大小发生变化的时候,产生WM_PAINT消息。//加载系统定义的光标。if(NULL==hWnd)//窗口句柄。......

qq_52119661的博客 454

微信图片.dat文件解密实战:用Python一键转PNG(附完整代码)

本文详细介绍了如何通过Python解密微信图片.dat文件并转换为PNG格式的完整教程。文章深入解析了微信.dat文件的异或加密原理,提供了自动检测密钥的Python脚本,并分享了批量解密和性能优化的实用技巧,帮助用户轻松恢复和整理微信聊天图片。

weixin_29096377的博客 466

YOLOv13改进策略【注意力机制篇】| ICASSP 2023 EMA 高效多尺度注意力,跨空间学习提高远距离建模依赖

ICASSP 2023 EMA 高效多尺度注意力在 YOLOv13 的接入实战:跨空间学习提升远距离依赖建模,含原理图解、完整代码、yaml 配置与实测参数量对比(ultralytics 8.3.63)。

qq_53329130的博客 935

WM_paint详解

WM_PAINT是Windows窗口系统中一条重要的消息, 应用程序通过处理该消息实现在窗口上的绘制工作。 1. 系统何时发送WM_PAINT消息?   系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由系统管理的,应用只是被动地接收该消息,在消息

维c银翘片 790

【图像超分】论文精读:RepSR: Training Efficient VGG-style Super-Resolution Networks with Structural Re-Paramete

摘要: 本文提出RepSR,一种基于结构重新参数化和批量归一化(BN)的高效VGG式超分辨率网络。针对SR任务中BN易引发伪影的问题,作者通过分析发现训练-测试阶段的不一致性是主因,并提出先使用小批量统计训练、后期切换为总体统计的优化策略。RepSR块设计包含干净的残差路径和带改进BN的扩展-压缩卷积路径,有效平衡了训练非线性与推理效率。实验表明,RepSR在不同模型规模下优于现有重参数化方法,且实际推理速度更快。该工作为SR提供了性能与效率兼优的解决方案,相关代码未开源。 关键词: 超分辨率、结构重参数化

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 305

WM_PAINT 是如何触发的

WM_PAINT消息在Windows操作系统中是一个非常重要的消息,它用于通知窗口需要重绘其客户区。在处理WM_PAINT消息时,窗口程序通常会在其窗口处理函数中添加相应的消息处理逻辑。这通常涉及使用BeginPaint和EndPaint函数来设置和结束绘制操作,并在它们之间执行实际的绘制工作。总结来说,WM_PAINT消息是Windows操作系统用于通知窗口程序其客户区需要重绘的一种机制。它可以在多种场景下被触发,以确保窗口内容的正确显示。

lijian2017的博客 1563

python实现Markowitz模型 (附完整源码)

python实现Markowitz模型 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 405

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

关于WM_PAINT

大多数Windows程序在WinMain中进入消息循环之前的初始化期间都要呼叫函数UpdateWindow。Windows利用这个机会给窗口消息处理程序发送第一个WM_PAINT消息。这个消息通知窗口消息处理程序:必须绘制显示区域。此后,窗口消息处理程序应在任何时刻都准备好处理其它WM_PAINT消息,必要的话,甚至重新绘制窗口的整个显示区域。在发生下面几种事件之一时,窗口消息处理程序会接收到一个

开心辞典 1497

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

WM_PAINT消息总结

UpdateWindow()函数是让消息队列中的WM_PAINT消息立刻进入window   procedure而得到处理,不是说 由UpdateWIndow()产生WM_PAINT消息,WM_PAINT消息是由于窗口中存在无效区域需要重汇而产生的。设 想一下如果你的客户区没有无效区域,你调用再多的UpdateWindow()也不能产生WM_PAINT消息,由于 WM_PAINT

bug07250432的专栏 859

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WM_PAINT与WM_ERASEBKGND

本文最新链接地址:http://lifepeak.net/it-jishu/wm_paint-wm_erasebkgnd.html     当WM_PAINT不是由InvalidateRect产生时,即由最大化,最小化等产生时,或者移动产生(移动有时只会产生WM_ERASEBKGND消息)系统先发送WM_ERASEBKGND消息,再发送WM_PAINT消息.    如果处理WM_ERA

World7th的专栏 1万+

WM_PAINT详解和WM_ERASEBKGND

WM_PAINT简介: WM_PAINT消息在Windows程序设计中是很重要的。当窗口显示区域的一部分显示内容或者全部变为“无效”,以致于必须“更新画面”时,将由这个消息通知程序。 WM_PAINT产生的时机: 1. 系统产生 其实系统会在很多的不同的机制下发送WM_PAINT消息,比如调用UpdateWindow函数,第一次创建窗口,改变了窗口的大小,最大化,最小化等等。这些动作...

Barry的博客 7840

[WGDI]WM_PAINT 消息处理

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

ZHWEHA 2070

WM_PAINT 检测例子

// DEMO3_6.CPP - WM_PAINT tracker// INCLUDES ///////////////////////////////////////////////#define WIN32_LEAN_AND_MEAN  // just say no to MFC#include    // include all the windows headers#include

清风一吹(清风博客) 921

WM_PAINT 消息详解

<br /><br />本文转自:http://hi.baidu.com/sunkanghome/blog/item/90f3d3893b5923b60f244428.html<br /> <br />WM_PAINT是Windows窗口系统中一条重要的消息,<br />应用程序通过处理该消息实现在窗口上的绘制工作。<br />1. 系统何时发送WM_PAINT消息?<br /><br />   系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个

To be code... 1702

处理WM_PAINT消息

一般地,处理WM_PAINT消息的形式如下:case WM_PAINT:         hdc=BeginPaint(hwnd,&ps); //取得设备内容句柄        使用GDI函数;         EndPaint(hwnd,&ps);   //释放句柄        Return 0;        在处理WM_PAINT消息时,必须成对地呼叫BeginPaint和EndPaint

开心辞典 1631

WM_Paint 消息详解

WM_PAINT 是 Windows 窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作。1. 系统何时发送WM_PAINT消息?   系统会在多个不同的时机发送 WM_PAINT 消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由 系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大

sdn_009的专栏 2560
上一篇: 关于VC中 error C2871: 'std' : does not exist or is not a namespace
下一篇: C++命名规则【转】
Narvik
博客等级 码龄16年 1粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值