1.Windows程序是一个多任务交叉进行处理的系统,借助消息传送进行管理,EX:鼠标单击事件、敲击键盘事件
为了能统一标示不同外设发出的消息从而方便OS进行处理,windows需要把这些不同的消息转换成统一的格式----即“消息”(Message)
2.消息是一个构体,其成员有“欲送达窗口的句柄、消息的代号、携带的参数说明、时间、鼠标点击位置”
注意:消息到达的目标地方是窗口而不是程序
3.因为在程序运行的过程中会有源源不断的消息产生,而windows在某一时间内只能处理一个消息,所以为了捕捉到每一个消息对每一个消息进行响应,在每一个程序运行之始,windows会为每一个程序分配一个消息队列来存放这些消息,当有新消息产生时,windows首先将其放入消息队列中,待有空闲时再予以处理
4.消息不会主动送给程序,必须由程序主动地从队列中读取,所以Winmain()通常会以一个while(GetMessage(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)由winmain的GetMessage()从消息队列中取消息
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)
第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回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