现在的位置: 首页 > 综合 > 正文

Windows中的消息到底是什么??

2018年06月08日 ⁄ 综合 ⁄ 共 1958字 ⁄ 字号 评论关闭

1.Windows程序是一个多任务交叉进行处理的系统,借助消息传送进行管理,EX:鼠标单击事件、敲击键盘事件

为了能统一标示不同外设发出的消息从而方便OS进行处理,windows需要把这些不同的消息转换成统一的格式----即“消息”(Message

2.消息是一个构体,其成员有“欲送达窗口的句柄、消息的代号、携带的参数说明、时间、鼠标点击位置”

注意:消息到达的目标地方是窗口而不是程序

3.因为在程序运行的过程中会有源源不断的消息产生,而windows在某一时间内只能处理一个消息,所以为了捕捉到每一个消息对每一个消息进行响应,在每一个程序运行之始,windows会为每一个程序分配一个消息队列来存放这些消息,当有新消息产生时,windows首先将其放入消息队列中,待有空闲时再予以处理

4.消息不会主动送给程序,必须由程序主动地从队列中读取,所以Winmain()通常会以一个whileGetMessage(msg ,NULL ,0 ,0){}的循环来不断的读取消息

5.每一个程序都有一个消息队列,对于一个程序来说会有不同的任务等待处理,每一个任务对应不同的窗口对象,也就是Windows的多任务机制。

GetMessage()windows多任务机制的基础:当Getmessage从消息队列中取消息时证明当前没有任务交给当前程序的某窗口做,此时GetMessage()将处理权交给Windows,以便windows将控制权转交给程序的下一个任务窗口,这样也就实现了windows的多任务机制,一个程序处理多个任务。

while{}循环内部会对收到的消息结构体进行解析,看其msg的窗口句柄是哪一个,然后调用Dispatch Message对消息根据相应的窗口句柄进行派发,交付给个窗口的消息处理函数进行处理

6.每一个消息会引发不同的消息响应,不同的处理效果:

windows下每一个窗口有一个自己的消息处理函数,消息处理函数中会根据不同种类的消息分switch语句调用不同的处理函数进行处理,对于其不关心的消息全归为default

7.以上所述反映了如下观点:windows程序是消息驱动的

8.总结归纳------windows处理流程如下:

1)将所发生的事件进行格式转化,转化为消息(Message)

2)将msg放在程序的消息队列中,等待windows闲下来了再处理

3)由winmainGetMessage()从消息队列中取消息

4)取到消息之后,进入循环体内部,根据消息的所针对的窗口句柄进行消息的派发(dispatch message

5)相应窗口对所收到的消息进行向相应处理

6)进入到下一次循环,第二次GetMessage()、从消息队列继续取消息,直至消息队列为空

9.API MFC中不见了switch case取而代之的是消息映射机制

为什么要出现消息映射机制??因为switch中有不同的消息以及相应的消息处理函数,那么当有很多消息时switch就会很复杂,所以MFC使用消息映射机制-------一个宏定义唯一标示一个消息;一个消息处理函数;一个消息映射宏(ON_MESSAGE( WM_MYMESSAGE, OnMyMessage )这样就把消息与消息处理函数对应起来,当发生所定义的消息时就触发某处理函数
10.
如何手动添加一个自定义消息:

第一步:定义消息Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。
#define WM_MYMESSAGE (WM_USER + 100)

第二步:实现消息处理函数。该函数使用WPRAMLPARAM参数并返回LPESULT
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 
处理用户自定义消息,填空就是要填到这里。
return 0;
}
第三步:在类头文件的AFX_MSG块中说明消息处理函数
// {{AFX_MSG(CMainFrame)
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
ON_MESSAGE( WM_MYMESSAGE, O、nMyMessage )

(以上所写均为本人自己按条整理的笔记,可能体力至于本人思路相符,望诸位多多包涵)

 

本文出自 “W小姐的夏天” 博客,请务必保留此出处http://wmiracle.blog.51cto.com/7366281/1274593

【上篇】
【下篇】

抱歉!评论已关闭.