zoukankan      html  css  js  c++  java
  • [VC]WindowProc和DefWindowProc函数

    在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函数来处理未处理的消息。

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

  • 相关阅读:
    Linux基础知识
    redis info
    记录: 解决 pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other)
    IOS IAP 自动续订 之 利用rabbitmq延时队列自动轮询检查是否续订成功
    Python3.6 的字典为什么会快
    IAP 订阅后端踩坑总结之 Google 篇
    docker 命令合集
    Python Schema使用说明
    Apache Bench测试
    channels2.X 学习笔记
  • 原文地址:https://www.cnblogs.com/gredswsh/p/WindowProc_and_DefWindowProc.html
Copyright © 2011-2022 走看看