VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 652|回复: 3

[扩展阅读] Windows消息机制的理解

[复制链接]
51_avatar_middle
最佳答案
82 
online_admins 发表于 2019-12-22 23:29:53 | 显示全部楼层 |阅读模式
一. 消息的概念
当用户单击鼠标、改变窗口大小或者按下键盘上的一个键等用户动作时,会触发点击,按键等事件,而windows系统把这些事件转化为特定的消息,并放置在应用程序的消息列队中(windows为当前运行的每一个windows程序维护了一个消息列队)等待应用程序的处理,而应用程序不断从消息列队中取出消息,并进行响应。所以说Windows是基于消息的事件驱动模式。

二. 消息如何被处理?(窗口函数)
按照一般写程序的思维而言,我们希望传给函数正确的参数来调用这个函数。而windows消息可以理解为指定了的函数的参数,例如:用户需要关闭某个窗口,点击了右上角的X后,windows便把这个行为转换为消息加入消息列队,而这个消息可能包含了“需要关闭的是哪一个窗口(窗口句柄)”,“关闭窗口的信息”这样的参数,应用程序从消息列队中读取到了这个消息,并把它交给“关闭窗口”这个函数来进行处理,而这个函数就叫做“窗口函数”,这样听起来不好理解,可以加长的理解为“处理窗口消息的函数过程”。
  而如果没有对应的函数来处理这个消息呢?例如,拖动窗口。为此,windows会用默认的消息处理函数(DefWindowProc)来进行处理.

三. 消息的组成
消息结构体长这样:
  1. typedef struct tagMSG {
  2.         HWND hwnd; //消息句柄,理解为窗口的唯一标志
  3.         UINT message; //消息类型,分为windows消息和用户自己定义的消息
  4.         WPARAM wParam; //消息附加参数
  5.         LPARAM lParam; //消息附加参数
  6.         DWORD time; //消息产生时间爱你
  7.         POINT pt; //消息被发送时的光标位置
  8. } MSG;
复制代码


四. 消息发送的方式
1. 投递消息PostMessage
异步执行,发送到消息列队后立即返回无序等待。
应用程序一般是投递一个消息来通知指定窗口完成某个任务
BOOL PostMessage( HWND hWnd, //目标窗口句柄 UINT Msg, //消息类型 WPARAM wParam, //第一个消息参数 LPARAM lParam //第二个消息参数 );

2. 发送消息 SendMessage
同步执行,需要等到消息的返回码之后在继续。
基本上所有的输入类消息,都是以投递的方式抵达应用的,而其他的消息,则大部分是采取了发送方式。
LRESULT SendMessage( HWND hWnd, //接收消息的目标窗口 UINT Msg, //消息类型 WPARAM wParam, //第一个消息参数 LPARAM lParam //第二个消息参数 );

五. 消息循环实例
  1. while(GetMessage (&msg, NULL, 0, 0)) //消息循环,不断从消息列队取出消息
  2. {
  3. TranslateMessage (&msg) ; //翻译键盘消息
  4. DispatchMessage (&msg) ; //把消息发送给窗口过程
  5. }

  6. //消息过程是一个CALLBACK回调函数,每处理一个消息会返回一个值给windows

  7. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
  8. {  
  9.     HDC         hdc;  
  10.     PAINTSTRUCT ps;  
  11.     RECT        rect;  
  12.   
  13.     switch (message)  
  14.     {  
  15.     case WM_CREATE:  
  16.         PlaySound(TEXT("hello.wav"), NULL, SND_FILENAME | SND_ASYNC);  //窗口创建的时候播放音乐
  17.         return 0;  
  18.   
  19.     case WM_DESTROY:  
  20.         PostQuitMessage(0);  //把退出窗口的消息插入消息列队
  21.         return 0;  
  22.     }  
  23.   
  24.     return DefWindowProc(hwnd, message, wParam, lParam);  //默认的消息处理函数
  25. }
复制代码




上一篇:DispatchMessage 函数说明
下一篇:第13课 第一个带界面的窗口程序 | 课程代码
86_avatar_middle
最佳答案
0 
online_vip 发表于 2019-12-30 11:45:17 | 显示全部楼层
DWORD time; //消息产生时间爱你  @管理员 我也爱你
51_avatar_middle
最佳答案
2 
在线会员 发表于 2020-3-1 08:15:34 | 显示全部楼层
祝VC驿站越办越好!...
41_avatar_middle
最佳答案
0 
在线会员 发表于 2020-8-20 10:36:19 | 显示全部楼层
学习了,感谢分享
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-30 00:42

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表