预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共20页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://blog.csdn.net/mathlmx/article/details/7188760"MFC之消息映射的实现(1) 分类:HYPERLINK"http://blog.csdn.net/mathlmx/article/category/944343"Window编程2012-01-0923:3860人阅读HYPERLINK"http://blog.csdn.net/mathlmx/article/details/7188760"\l"comments#comments"评论(0)HYPERLINK"javascript:void(0);"\o"收藏"收藏HYPERLINK"http://blog.csdn.net/mathlmx/article/details/7188760"\l"report#report"\o"举报"举报 Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。 1.消息的分类 1.队列消息和非队列消息从消息的发送途径上看,消息分两种:队列消息和非队列消息。队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。这里,对消息队列阐述如下:Windows维护一个系统消息队列(Systemmessagequeue),每个GUI线程有一个线程消息队列(Threadmessagequeue)。鼠标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。Windows每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列。线程消息队列接收送给该线程所创建窗口的消息。线程从消息队列取出消息,通过Windows把它送给适当的窗口过程来处理。除了键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。这些队列消息以外的绝大多数消息是非队列消息。2.系统消息和应用程序消息从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,为了ID的唯一性,使用::RegisterWindowMessage来得到该范围的消息ID。 2.消息结构和消息处理 1.消息的结构为了从消息队列获取消息信息,需要使用MSG结构。例如,::GetMessage函数(从消息队列得到消息并从队列中移走)和::PeekMessage函数(从消息队列得到消息但是可以不移走)都使用了该结构来保存获得的消息信息。MSG结构的定义如下:typedefstructtagMSG{//msgHWNDhwnd;UINTmessage;WPARAMwParam;LPARAMlParam;DWORDtime;POINTpt;}MSG;该结构包括了六个成员,用来描述消息的有关属性:接收消息的窗口句柄、消息标识(ID)、第一个消息参数、第二个消息参数、消息产生的时间、消息产生时鼠标的位置。 2.应用程序通过窗口过程来处理消息如前所述,每个“窗口类”都要登记一个如下形式的窗口过程:LRESULTCALLBACKMainWndProc(HWNDhwnd,//窗口句柄UINTmsg,//消息标识WPARAMwParam,//消息参数1LPARAMlParam//消息参数2)应用程序通过窗口过程来处理消息:非队列消息由Windows直接送给目的窗口的窗口过程,队列消息由::DispatchMessage等派发给目的窗口的窗口过程。窗口过程被调用时,接受四个参数:1.awindowhandle(窗口句柄);2.amessageidentifier(消息标识);3.two32-bitvaluescalledmessageparameters(两个32位的消息参数);需要的话,窗口过程用::GetMessageTime获取消息产生的时间,用::GetMessagePos获取消息产生时鼠标光标所在的位置。在窗口过程里,用switch/case分支处理语句来识别和处理消息。 3.应用程序通过消息循环来获得对消息的处理每个GDI应用程序在主窗口创建之后,都会进入消息循环,接受用户输入、解释和处理消息。消息循环的结构如下