现在的位置: 首页 > 综合 > 正文

(9)WindowProc和DefWindowProc函数

2014年02月17日 ⁄ 综合 ⁄ 共 1956字 ⁄ 字号 评论关闭
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函数来处理未处理的消息。
 
有了窗口消息处理函数,就可以响应不同的消息,实现各种各样的功能。

抱歉!评论已关闭.