windows消息

本文探讨了Windows程序中消息队列的概念,包括队列化与非队列化消息的区别,peekmessage()与getmessage()的功能特性,以及WM_PAINT消息触发的各种场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 消息队列
消息能够被分为「队列化的」和「非队列化的」。队列化的消息是由Windows放入程序消息队列中的。在程序的消息循环中,重新传回并分配给窗口消息处理程序。非队列化的消息在Windows呼叫窗口时直接送给窗口消息处理程序。也就是说,队列化的消息被「发送」给消息队列,而非队列化的消息则「发送」给窗口消息处理程序。任何情况下,窗口消息处理程序都将获得窗口所有的消息--包括队列化的和非队列化的。窗口消息处理程序是窗口的「消息中心」

队列化消息:

列化的消息是由Windows放入程序消息队列中的。在程序的消息循环中,重新传回并分配给窗口消息处理程序。

非队列化消息:

非队列化的消息在Windows呼叫窗口时直接送给窗口消息处理程序。

队列化消息包括:

队列化消息基本上是使用者输入的结果

<1>以击键(如WM_KEYDOWN和WM_KEYUP消息)

<2>击键产生的字符(WM_CHAR)

<3>鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN)

<4>时钟消息(WM_TIMER)、更新消息(WM_PAINT)和退出消息(WM_QUIT)。

非队列化消息包括:

<1>当WinMain呼叫CreateWindow时,Windows将建立窗口并在处理中给窗口消息处理程序发送一个WM_CREATE消息。

<2>当WinMain呼叫ShowWindow时,Windows将给窗口消息处理程序发送WM_SIZE和WM_SHOWWINDOW消息。

<3>当WinMain呼叫UpdateWindow时,Windows将给窗口消息处理程序发送WM_PAINT消息。

<4>键盘或鼠标输入时发出的队列化消息信号,也能在非队列化消息中出现。例如,用键盘或鼠标选择了一个菜单项时,键盘或鼠标消息就是队列化的,而说明菜单项已选中的WM_COMMAND消息则可能就是非队列化的。


2.peekmessage()和getmessage()

 

两者都是接受指定窗口相联系的消息和由postThreadMessage函数寄送的消息,不接受属于其他线程的消息。Getmessage()是阻塞函数,当系统无消息时,GetMessage会一直等待下一条消息,获取消息后将消息从队列中移除。PeekMesssge()是以查看的方式从系统中获取消息,可以不将消息从系统中移除,(并不是所有的消息PeekMessage()都能移除,例如WM_PAINT)是非阻塞函数;当系统无消息时,返回FALSE,继续执行后续代码。
PeekMesssge只得到那些与参数hWnd标识的窗口相联系的消息或被lsChild确定为其子窗口相联系的消息,并且该消息要在由参数wMsgFiterMin和wMsgFiherMax确定的范围内。如果hWnd为NULL,则PeekMessage接收属于当前调用线程的窗口的消息(PeekMessage不接收属于其他线程的窗口的消息)。如果hWnd为-1,PeekMessage只返回hWnd值为NULL的消息,该消息由函数PostThreadMessage寄送。如果wMsgFilterMin和wMsgFilterMax都为零,PeekMessage返回所有可得的消息(即,无范围过滤)。
常数WM_KEYFIRST和WM_KEYLAST可作为过滤值取得所有键盘消息;常数WM_MOUSEFIRST和WM_MOUSELAST可用来接收所有的鼠标消息


3.WM_PAINT消息产生的原因:
(1):在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。
(2):使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位旗标的设定)。
(3):程序使用ScrollWindow或ScrollDC函数滚动显示区域的一部分。
(4):程序使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息。
4. 无效区域:
如果在窗口消息处理程序处理WM_PAINT消息之前显示区域中的另一个区域变为无效,则Windows计算出一个包围两个区域的新的无效区域(以及一个新的无效矩形),并将这种变化后的信息放在绘制信息结构中。Windows不会将多个WM_PAINT消息都放在消息队列中。
整个显示区域无效的方法:Invalidate(hwnd,NULL,TRUE);第三个参数表示是否擦除背景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值