Windows核心编程第02天 消息机制

1.消息的概念

  消息是指windows操作系统发给应用程序的一个通告,告诉程序某个特定的事件发生了。比如用户点击鼠标,会引发相关的消息,并交给相应的程序去处理。最终处理消息的是应用程序的窗口函数,如果程序不负责处理的话,系统会作出默认的处理。

从数据结构的角度来说,消息是一个结构体,包含了消息的类型标识符以及其他的一些附加消息。

系统定义的结构体MSG用于表示消息,MSG具有如下形式:

typedef struct tagMSG { HWND hwnd;  //指定接收消息的窗口句柄,如果是线程消息,该值是 NULL UINT message;  //消息的标识符 WPARAM wParam;  //指定消息的附加消息,确切的含义取决于消息成员的值 LPARAM lParam;  //指定消息的附加消息,确切的含义取决于消息成员的值 DWORD time;  //该消息被投放到消息队列的时间 POINT pt;  //当消息被投放到消息队列的时,鼠标位于屏幕中的位置} MSG, *PMSG, *LPMSG;

2.Windows编程原理

  Windows 是一消息(Message)驱动式系统,Windows 消息提供了应用程序与应用程序之间、应用程序与Windows 系统之间进行通讯的手段。应用程序要实现的功能由消息来触发,并靠对消息的响应和处理来完成。Windows 系统中有两种消息队列,一种是系统消息队列,另一种是应用程序消息队列。计算机的所有输入设备由 Windows 监控,当一个事件发生时,Windows 先将输入的消息放入系统消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中,应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。一个事件的发生,到达处理它的窗口函数必须经历上述过程。

在程序队列中,应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。一个事件的发生,到达处理它的窗口函数必须经历上述过程。所谓消息就是描述事件发生的信息,Windows程序是事件驱动的,用这一方法编写程序

避免了死板的操作模式,因为Windows程序的执行顺序将取决于事件的发生顺序,具有不可预知性。

3.windows消息循环

  消息循环是Windows应用程序存在的根本,应用程序通过消息循环获取各种消息,并通过相应的窗口过程函数,对消息加以处理;正是这个消息循环使得一个应用程序能够响应外部的各种事件,所以消息循环往往是一个Windows应用程序的核心部分。Windows 的消息机制如图所示:

技术图片

  Windows 操作系统为每个线程维持一个消息队列,当事件产生时,操作系统感知这一事件的发生,并包装成消息发送到消息队列,应用程序通过GetMessage()函数取得消息并存于一个消息结构体中,然后通过一个TranslateMessage()和DispatchMessage()解释和分发消息,下面的代码描述了Windows 的消息循环。

4.消息的处理

  取得的消息将交由窗口处理函数进行处理,对于每个窗口类Windows为我们预备了一个默认的窗口过程处理函数DefWindowProc(),这样做的好处是,我们可以着眼于我们感兴趣的消息,把其他不感兴趣的消息传递给默认窗口过程函数进行处理。每一个窗口类都有一个窗口过程函数,此函数是一个回调函数,它是由Windows操作系统负责调用的,而应用程
序本身不能调用它。以switch语句开始,对于每条感兴趣的消息都以一个case引出。示例如下:

LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ HDC hdc; PAINTSTRUCT ps; RECT rect; switch (message) { case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); DrawText(hdc, TEXT("北京欢迎你"), -1, &rect, DT_CENTER | DT_VCENTER| DT_SINGLELINE); EndPaint(hwnd, &ps); break; case WM_LBUTTONDOWN: MessageBox(hwnd, TEXT("被按了一下"), TEXT("哎呀"), MB_OK); break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: break; } return DefWindowProc(hwnd, message, wParam, lParam);}

 

相关文章