请选择 进入手机版 | 继续访问电脑版

技术_方法_掌握技术,成就未来-6miu百度云

 找回密码
 立即注册
查看: 10|回复: 0

[转]关于windows 的窗口消息和WM

[复制链接]

329万

主题

329万

帖子

988万

积分

论坛元老

Rank: 8Rank: 8

积分
9889035
发表于 2021-1-4 13:17:12 | 显示全部楼层 |阅读模式
http://blog.csdn.net/keldon/archive/2007/08/10/1736338.aspx

关于WM_PAINT消息响应小结




  WM_PAINT消息小结
  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处理函数中使用。
  
  

  http://blog.csdn.net/ingor/archive/2007/06/21/1660205.aspx
  
  
  
  
    关于Windows窗口消息
   
   
   今天,闲着无事,就把Windows消息窗口章节又看了一遍,发现原来自己还有很多不懂的东西。 写于此以备录警示。

     关于消息队列有两种,一种是系统消息队列,另一种是线程消息队列。windows应用程序的运行需要依靠外部发生的事件来驱动。应用程序通过输入消息来接受输入。操作系统负责监视所有设备并将输入消息放入一个先进先出的队列中,即系统消息队列。接着,windows从系统消息队列中去走一条消息,确定目的窗口,并将消息送入创建该窗口的消息队列中。

   并不是每一个线程都有消息队列,只有当线程调用一个与图形用户界面有关的函数,系统才会为线程分配一个THREADINFO结构,并将这个数据结构与线程联系起来。该结构记录的各种消息的分类。

   对于该结构中,消息分为:1。登记消息队列(如:PostMessage发送的消息)2。虚拟输入队列(wm_keyup,wm_mousemove)3。发送的消息(SendMessage发送的消息)。4。其他 如wm_paint,wm_timer

   处理消息的算法:

   对于windows来说,当调用getMessage或PeekMessage时,按下列顺序从消息队列中获得消息进行处理:

   1)首先处理sendMessage发送的消息

   2)接着处理PostMessage发送的消息

   3)检查是否有WM_QUIT消息

   4)处理虚拟消息队列

   5)如果有WM_PAINT消息,就处理

   6)如果有WM_TIMER消息,就处理

   windows处理判断处理顺序时,察看的是标志位(以QS_*描述的一些消息标志),利用这些标志位,来确定是否对应的消息队列中有对应的消息。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|技术_方法_掌握技术,成就未来-6miu百度云

GMT+8, 2021-1-28 16:13 , Processed in 0.067253 second(s), 19 queries .

合作伙伴:

盘搜搜 / 百度云搜索 / 盘多多 / 如风搜 / 小说阅读网 / 笔趣阁 / 文库 / 学术 / 小说排行榜 / 专利网 / 专利查询 / 网盘搜索 / 网盘 / 问医生 / 健康网 / APP开发 / 金蝶 / 软件定制 / 软件开发 / 教育app / ERP系统 / SAP / 分销系统 / 成都软件开发 / 小程序开发 / ERP / WMS / MES / LIMS / SCADA / PLM / PDM / 希沃 / SEEWO / OTO / O2O / 培训系统 / 在线问诊 / 在线问诊系统 / 医疗咨询系统 / 网店代运营 / 返利网 / 京东代运营 / 斯特封 / trelleborg / NOK / 斯凯孚 / SKF / 圣戈班 / Saint-Gobain / 派克汉尼汾 / parker / 洪格尔 / hunger / Merkel / 密封圈 /
快速回复 返回顶部 返回列表