- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2章 消息与消息队列
第2章 消息与消息队列 2.1 关于消息与消息队列 2.1.1 消息 2.1.2 消息路由 2.1.3 消息处理 2.1.4 投递和发送消息 2.1.5 消息种类 2.1.6 消息过滤 2.1.7 消息死锁 2.2 使用消息及消息队列 2.2.1 创建消息环 2.2.2 投递消息 2.2.3 发送消息 2.1 关于消息与消息队列 与传统的应用程序不同,Windows应用程序并不显式地用一个函数的调用(如getchar)来获取输入,而是等待系统把输入传给它们。 系统把应用程序的所有输入传给应用程序的窗口,每个窗口都有一个称之为窗口过程的函数,当窗口有输入时系统要调用它,窗口过程处理输入并把控制返回系统。 2.1.1 消息 系统以消息的形式把输入传给窗口过程,消息是由系统或应用程序产生的,系统对每一个输入事件都要产生消息。 应用程序可通过产生的消息指导它自己的窗口来完成某个任务、或是与其它应用程序的窗口进行通信。 系统把消息发送给窗口过程,窗口过程的函数原型如下: LRESULT CALLBACK WindowProc(HWND hwnd, // 窗口句柄 UINT uMsg, // 消息标识 WPARAM wParam, // 消息参数1 LPARAM lParam // 消息参数2); 消息标识是一个命名的常量,由它来标明消息的目的。窗口过程就是通过消息标识来决定如何处理消息的。 消息参数指定窗口过程在处理消息时所要用的数据或数据的位置,消息的意图及数值取决于消息本身。消息参娄可以是一个整数、紧缩的位标志、一个含有附加数据结构的指针等等。如果消息不使用消息参数,一般就都设置成NULL,窗口过程必须检查消息标识以确定如何解释消息参数。 2.1.2 消息路由 系统用两种方式向窗口过程发送消息: 把消息投递到一个先进先出的消息队列中,它是一个系统定义的内存块用于临时存储消息。 把消息直接发送给窗口过程。 投递到消息队列中的消息叫排队消息,它们主要是用户通过鼠标或键盘的输入结果,其它排队消息包括定时器、绘制和退出。 所有直接发送到窗口过程的其它消息称之为非排队消息。 2.1.2.1 排队消息 系统要用到消息队列,它要处理一个系统消息队列和任意数目线程消息队列,每一个队列对应于一个线程。 WM_PAINT消息有点特别,系统总是把这条消息放在消息队列的最后,这样可保证窗口按先进先出的次序接收它。 它被保持在队列中,只有队列中没有其它的消息时才发送到窗口过程。 同一个窗口的多个WM_PAINT消息被合并成一个,把客户区所有无效部分合并成一个区域,合并它节约了窗口必须重画客户区内容的时间。 系统向线程消息队列投递消息是通过填充一个MSG结构,再把它复制到消息队列中。 typedef struct tagMSG {// msg HWND hwnd; //窗口句柄 UINT message; //消息标识 WPARAM wParam; //消息参数1 LPARAM lParam; //消息参数2 DWORD time; //消息时间 POINT pt; //鼠标位置 } MSG; 线程可把消息投递到它自己的消息队列中或是通过函数PostMessage和PostThreadMessage把消息投递到其它线程的队列中去。 应用程序可通过函数GetMessage从它的队列中移走一条消息。 应用程序可通过函数PeekMessage来检查队列中的某个消息但并不移走它。 BOOL GetMessage ( LPMSG lpMsg, //存放消息 HWND hwnd, //获取该窗口的消息,若为NULL, 则获取该应用程序的所有消息 UINT uMsgMin, //消息范围 UINT uMsgMax); 遇WM_QUIT消息为零 把一条消息从它的队列中移走后,应用程序可用函数DispatchMessage指导系统把这条消息发送到窗口过程进行处理。它利用前面GetMessage或PeekMessage填充的MSG结构的指针,把窗口句柄、消息标识及两个消息参数传给窗口过程,但它并不传送时间或鼠标位置,可通过调用函数GetMessageTime和GetMessagePos来获取这些信息。 2.1.2.2 非排队消息 非排队消息是直接发送到目标窗口过程的,而不是通过系统消息队列和线程消息队列
文档评论(0)