再上一篇:2.5 显示窗口
上一篇:2.6 消息循环
主页
下一篇:2.8 WM_PAINT消息
再下一篇:2.9 WM_DESTROY消息
文章列表

2.7 窗口函数与消息处理

《Windows 下的 C/C++高级编程》讲述Windows环境下调用Win32 API函数程序设计

以上我们所讨论的从某种意义上说只是一些外围的准备性工作。真正实质性的工作在于对消息的处理,这些在窗口函数中实现。窗口函数中定义了对各种消息的响应动作,包括内容的显示、对用户输入的响应等。可以说,窗口函数是窗口最重要的部分,是窗口的精华所在。

只要不和其他窗口函数的名称发生冲突,窗口函数的名称可以任取。在HelloWin中,窗口函数即是WndProc。一个窗口过程总是通过RegisterClass函数调用与特定的窗口类相关联;而通过CreateWindow函数调用,基于同一个窗口类可以创建多个窗口。

窗口函数的定义如下:

LRESULT CALLBACK WndProc( HWND hwnd, UINT message,

WPARAM wParam, LPARAM lParam );

该函数的4个参数与MSG结构的前4个域是相同的,这里不再一一赘述。

值得注意的是这里的CALLBACK调用方式。CALLBACK函数是指由程序员定义、编程实现,而由Windows系统调用的函数。这种函数由编写而由Windows调用,这正是Windows消息驱动的重要表现之一。

窗口函数接收的每一个消息都是用一个数值来标识的,也就是窗口函数的message参数。在WINUSER.H中为每一个消息参数定义了一个以“WM_”(windows message,即“窗口消息”)为前缀的标识符。

一般使用switch和case结构来确定窗口函数接收什么样的消息,以及如何适当地处理这些消息。窗口函数在处理完消息以后,必须返回0值。凡是窗口函数不予处理的消息应当传给名为DefWindowProc的函数加以处理。

一般的处理结构示意如下:

switch ( message )

{

case WM_××××××:

//响应的处理语句

return 0;

//各种予以接收处理的消息

#第25页~ Windows下的C/C++高级编程

… … … … … … … …

}

return DefWindowProc( hwnd, message, wParam, lParam );

请注意,凡是窗口函数不予处理的消息都应当交由 Windows 默认消息处理函数DefWindowProc加以默认的处理。