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

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

转载于:https://www.cnblogs.com/gredswsh/p/WindowProc_and_DefWindowProc.html

[VC]WindowProc和DefWindowProc函数相关推荐

  1. VC++ inline内联函数的作用解决方案

    VC++ inline内联函数的作用解决方案 __attribute__((always_inline)) attribute((always_inline))的意思是强制内联,所有加了attribu ...

  2. VC 2010的MFC函数,CMFCVisualManager::GetInstance()可能导致内存泄露

    今天在网上看到一篇文章,关于CMFCVisualManager的内存泄露问题( 链接是 http://zhanyonhu.blog.163.com/blog/static/16186044201132 ...

  3. VC++  DLL 导出函数

    VC++ DLL  导出函数 经常使用VC6的Dependency查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导致不同的原因大多是和编译DLL时候指定DLL导出函数的界定符有关 ...

  4. WindowProc和DefWindowProc的区别

    1. WindowProc是你给自己的窗口定义的窗口处理函数 DefWindowProc是windows平台提供的默认窗口处理函数 如果某些消息你不需要做特别的处理,调用DefWindowProc进行 ...

  5. VC++ 绘制线条 OnLButtonDown函数(DrawView.cpp) 利用SDK全局函数实现画线功能 利用MFC的CDC类实现画线功能 利用MFC的CClientDC类实现画线功能

    目录 绘制线条 OnLButtonDown函数(DrawView.cpp) 利用SDK全局函数实现画线功能 利用MFC的CDC类实现画线功能 利用MFC的CClientDC类实现画线功能 接上:VC+ ...

  6. VC++程序中用PlaySound函数加入自定义声音

    (转)VC++编程中,我们可以为自己的程序加入音乐,比如当我们按下一个按钮时或者启动程序时,播放一小段音乐. PlaySound函数的声明为: BOOL PlaySound(LPCSTR pszSou ...

  7. matlab转换成vc,如何将matlab65函数转换成vc++60动态链接库.doc

    如何将matlab65函数转换成vc++60动态链接库.doc 1如何将Matlab6.5函数转换成VC++6.0动态链接库1.编写Matlab函数函数文件sum_prod.m,内容如下:functi ...

  8. 关于VC中的时间函数讨论

    关于在VC中时间函数的事业问题在论坛有不少的帖子讨论,下面结合讨论结果和相关的知识做个总结. 先从一个如何在程序中延时的问题谈起,延时的方法有 方法一: 使用sleep函数,它的最小单位是1ms,如延 ...

  9. find函数的使用方法及实例 c语言,VC编程中FindWindow函数的用法

    1.    函数的声明: Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal ...

最新文章

  1. Android selector 使用
  2. 第四周项目五-用递归方法求解(求n的阶乘)
  3. MySQL数据单个数据太大,导入不进去
  4. centeros 7源码安装mysql_Linux下源码编译安装MySql,centeros7
  5. 计算机信息安全专业欧洲排名,美国大学信息安全专业排名TOP10一览 加州大学伯克利分校居首...
  6. c 语言多参数函数,C/C++实现多参数函数编程
  7. ubuntu: root用户
  8. NUC1170 加农炮
  9. HashMap(HashSet)的实现
  10. python二维列表转字典_在Python中字符串、列表、元组、字典之间的相互转换
  11. 决策树系列(五)——CART
  12. 大数据引领医药行业 为时过早
  13. PDF文件怎么制作,PDF文件制作方法
  14. 电脑cpu测试软件 95,用Prime95测试cpu性能稳定性的方法
  15. 计算机网络管理员二级考试题,计算机网络管理员(二级)操作鉴定试题A
  16. grep 多条件并行满足_grep多个条件
  17. 新注册第一帖----------------------乱码新手自学.net 之Linq 入门篇
  18. android 电池(一):锂电池基本原理篇 .
  19. 已知三角形三边长求面积java_已知三角形三点坐标求三角形面积.java
  20. 用Python去优惠券,看到结果我惊呆了!

热门文章

  1. 患者是否应该主动关注医疗知识
  2. no instance(s) of type variable(s) X exist so that DataSource<X> conforms to DataStream<Order>
  3. superset出现A valid API access token is required to use Mapbox data
  4. 第4章-机器学习基础
  5. sql判断null/空缺值
  6. 在mysql-workbench的存储过程中使用循环while,repeat,loop
  7. Java怎么使用spring定时器_浅析spring定时器的使用
  8. word2vec, LSTM Speech Recognition实战, 图数据库
  9. Extjs09 双击事件
  10. 游戏缺少index.html,index.html