MFC将thread分成winddow thread和worker thread,在讨论多现程(Multi-thread)之前,我们先只考虑window thread。
windows programming的基本工作方式和console application的不同,基本上是这样运行的,程序从WinMain()开始,然后进入一个message loop,程序在这里等待发给它的所有消息然后一一处理,直到接收到WM_QUIT的消息的时候,message loop终止,程序结束。所以整个主程序运行的过程就是等待消息,接收消息,然后处理消息的过程。 窗口建立的时候CreateWindow, RegisterWindow之类的不必太费心,MFC已经全管理妥当了,需要提起一点注意的是程序开始时HINSTANCE hInstance这个参数,在和DLL打交道的时候会帮你解决很多问题,如果一个Bitmap Load不上来,或者一个Dialog DoModal之后不出来,估计就得向这个参数求助了,这是后话。 具体处理的消息的函数叫window procedure,具体处理消息的code叫message handler。它可以是当前应用程序的API,也可以是调用的不同DLL的API。不同的DLL叫不同的module。以后的文章中我会具体说明module state。是个很重要的话题。(当项目大的时候) 没有message handler的消息交给DefWindowProc()函数处理,差不多可以理解为什么也不作了。 消息包括四个参数,window handle,message ID,和另外两个参数wParam, lParam。window handle可以作为window的识别ID来用。所以在发送消息的时候如果可以有两种格式: pWnd->SendMessage(message, wParam = 0, lParam); 发送消息如果用SendMessage消息将立刻发送,如果用PostMessage,消息将进入Message queue按当前顺序发送,一般没有特别的要求PostMessage已经足够了。 由于可能收到的信息种类很多,用传统的switch来处理在程序中会显得很乱,于是MFC采用了Message Map机制。Message Map 机制实现了收到的信息和处理信息函数的mapping。在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间定义的消息会在window接收到之后一一传给对应的message handler处理。 所有用于处理信息的函数的申明需要有afx_msg关键字。对于系统所要处理的message,ON_WN_XXX 一般跟三个参数,WPARAM(wParam),LOWORD(lParam) 和HIWORD(lParam).用不到的参数会省略。 下面列举一下Message Map中可能用到的关于宏 1。Window间SendMessage或PostMessage收到的消息如果是系统将要管理的,在Message Map中一般用ON_WM_XXX。“XXX”是具体消息名字。例如画窗口是ON_WM_PAINT。如果是自定义的消息ON_MESSAGE()。例如窗口pWndA发消息给窗口pWndB。pWndB->PostMessage(WM_MYMSG1),那么Window B要处理这个消息需要在Message Map里面写上 ON_MESSAGE(WM_MYMSG1, OnMessage1),然后写OnMessage1函数作message handler。WM_MYMSG1的定义应放在user message中,WM_USER+NNN。注意最好不要和其它已有的ID重复,这个没有办法自动检查。 2。ON_COMMAND,ON_UPDATE_COMMAND_UI,ON_COMAND_RANGE 4。ON_REGISTERED_MESSAGE |
Window消息传递机制
最新推荐文章于 2023-06-27 09:41:49 发布
Window消息传递机制
2007-03-10 23:12