Windows API一日一练(9)WindowProc和DefWindowProc函数

Post date: 2012/3/27 上午 07:15:36

分类: Direct3D2007-07-17 08:52 11430人阅读 评论(1) 收藏 举报

在Windows操作系统里,当窗口显示之后,它就可以接收到系统源源不断地发过来的消息,然后窗口就需要处理这些消息,因此就需要一个函数来处理这些消息。在API里定义了一个函数为回调函数,当系统需要向窗口发送消息时,就会调用窗口给出的回调函数WindowProc,如果WindowProc函数不处理这个消息,就可以把它转向DefWindowProc函数来处理,这是系统的默认消息处理函数。当你按下菜单,或者点击窗口时,窗口需要运行这个消息处理函数。

函数WindowProc声明如下:

LRESULT CALLBACK WindowProc( HWND hwnd,

UINT uMsg,

WPARAM wParam,

LPARAM lParam

);

hwnd是当前窗口的句柄。

uMsg是系统发过来的消息。

wParam是消息参数。

lParam是消息参数。

这个函数一定是静态函数,也就是全局函数,在编译时已经确定了地址。由于它需要设置在注册的窗口类型里,如下:

#008 ATOM MyRegisterClass(HINSTANCE hInstance)

#009 {

#010 WNDCLASSEX wcex;

#011

#012 wcex.cbSize = sizeof(WNDCLASSEX);

#013

#014 wcex.style = CS_HREDRAW | CS_VREDRAW;

#015 wcex.lpfnWndProc = WndProc;

第15行就是设置窗口的消息处理函数。

函数DefWindowProc声明如下:

LRESULT DefWindowProc( HWND hWnd,

UINT Msg,

WPARAM wParam,

LPARAM lParam

);

这个函数参数跟上面那个函数是一样的。

只不过,它是处理所有默认的消息。

调用这两个函数的实例如下:

#001 //

#002 // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)

#003 //

#004 // 目的: 处理主窗口的消息.

#005 //

#006 // 蔡军生 2007/07/12

#007 //

#008 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

#009 {

#010 int wmId, wmEvent;

#011 PAINTSTRUCT ps;

#012 HDC hdc;

#013

#014 switch (message)

#015 {

#016 case WM_COMMAND:

#017 wmId = LOWORD(wParam);

#018 wmEvent = HIWORD(wParam);

#019 // 菜单选项命令响应:

#020 switch (wmId)

#021 {

#022 case IDM_ABOUT:

#023 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

#024 break;

#025 case IDM_EXIT:

#026 DestroyWindow(hWnd);

#027 break;

#028 default:

#029 return DefWindowProc(hWnd, message, wParam, lParam);

#030 }

#031 break;

#032 case WM_PAINT:

#033 hdc = BeginPaint(hWnd, &ps);

#034 //

#035 EndPaint(hWnd, &ps);

#036 break;

#037 case WM_DESTROY:

#038 PostQuitMessage(0);

#039 break;

#040 default:

#041 return DefWindowProc(hWnd, message, wParam, lParam);

#042 }

#043 return 0;

#044 }

第8行定义消息处理函数

第14行开始根据不同的消息作处理。

第29行和第41行都是调用DefWindowProc函数来处理未处理的消息。

有了窗口消息处理函数,就可以响应不同的消息,实现各种各样的功能。