WEB开发网
开发学院软件开发VC MFC教程(4)-- 消息映射的实现(1) 阅读

MFC教程(4)-- 消息映射的实现(1)

 2010-03-25 20:33:51 来源:WEB开发网   
核心提示:消息结构和消息处理消息的结构为了从消息队列获取消息信息,需要使用MSG结构,MFC教程(4)-- 消息映射的实现(1)(2),例如,::GetMessage函数(从消息队列得到消息并从队列中移走)和::PeekMessage函数(从消息队列得到消息但是可以不移走)都使用了该结构来保存获得的消息信息,当得到消息WM_QU

消息结构和消息处理

消息的结构

为了从消息队列获取消息信息,需要使用MSG结构。例如,::GetMessage函数(从消息队列得到消息并从队列中移走)和::PeekMessage函数(从消息队列得到消息但是可以不移走)都使用了该结构来保存获得的消息信息。

MSG结构的定义如下:

typedef struct tagMSG { // msg

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

} MSG;

该结构包括了六个成员,用来描述消息的有关属性:

接收消息的窗口句柄、消息标识(ID)、第一个消息参数、第二个消息参数、消息产生的时间、消息产生时鼠标的位置。

应用程序通过窗口过程来处理消息

如前所述,每个“窗口类”都要登记一个如下形式的窗口过程:

LRESULT CALLBACK MainWndProc (

HWND hwnd,// 窗口句柄

UINT msg,// 消息标识

WPARAM wParam,//消息参数1

LPARAM lParam//消息参数2

)

应用程序通过窗口过程来处理消息:非队列消息由Windows直接送给目的窗口的窗口过程,队列消息由::DispatchMessage等派发给目的窗口的窗口过程。窗口过程被调用时,接受四个参数:

a window handle(窗口句柄);

a message identifier(消息标识);

two 32-bit values called message parameters(两个32位的消息参数);

需要的话,窗口过程用::GetMessageTime获取消息产生的时间,用::GetMessagePos获取消息产生时鼠标光标所在的位置。

在窗口过程里,用switch/case分支处理语句来识别和处理消息。

应用程序通过消息循环来获得对消息的处理

每个GDI应用程序在主窗口创建之后,都会进入消息循环,接受用户输入、解释和处理消息。

消息循环的结构如下:

while (GetMessage(&msg, (HWND) NULL, 0, 0)) {//从消息队列得到消息

if (hwndDlgModeless == (HWND) NULL ||

!IsDialogMessage(hwndDlgModeless, &msg) &&

!TranslateAccelerator(hwndMain, haccel, &msg)) {

TranslateMessage(&msg);

DispatchMessage(&msg); //发送消息

}

}

消息循环从消息队列中得到消息,如果不是快捷键消息或者对话框消息,就进行消息转换和派发,让目的窗口的窗口过程来处理。

当得到消息WM_QUIT,或者::GetMessage出错时,退出消息循环。

Tags:MFC 教程 消息

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接