VC的事件模型
2005-07-12 10:15
337 查看
VC的事件模型
所有的窗口在操作系统中都以一个数据结构维护着,这个数据结构就是预先注册的窗口类,一个窗口类可以有多个实例,这个窗口类有一个重要的成员:对应的窗口事件处理函数的地址。
在MFC中,所有窗口的这个函数地址都被注册成为AfxWndProc(),这个全局函数会根据窗口句柄查找到对应的CWnd对象。然后调用AfxWndCallProc(),调这个函数的作用是为了把这个消息保存下来备用(为了后面DefWinProc()用)然后就调用CWnd对象的WindowProc()函数(从此时开始的所有函数可以OverWrite),WindowProc()函数会调用OnWndMsg()来处理消息,要是OnWndMsg()没有处理消息,它会调用DefWinProc()来处理(此处的包装使得好像是CWnd的WindowProc()是注册的消息处理函数),OnWndMsg()函数会判断消息的类型,如果是一个OnCommand消息,它会调用OnCommand()函数来处理,如果是OnNotify消息,它会调用OnNotify()函数来处理,这两个函数都会先试着把消息映射回控件类(CButton如果有的话),如果控件类不处理这个消息,那么因为这个消息已经是命令消息,不是窗口消息,已经不是专属于窗口来管了。它就调用CcmdTarget类的OnCmdMsg()函数来处理(当然窗口也可以处理),OnCmdMsg()函数会查找消息映射或者进行消息传递。所有没有被传入OnCommand或OnNotify的都被认为是窗口消息,直接在本CWnd的消息映射中查找消息处理函数,要是找不到就返回WindwoProc()让DefWinProc()来处理它。
所有的窗口在操作系统中都以一个数据结构维护着,这个数据结构就是预先注册的窗口类,一个窗口类可以有多个实例,这个窗口类有一个重要的成员:对应的窗口事件处理函数的地址。
在MFC中,所有窗口的这个函数地址都被注册成为AfxWndProc(),这个全局函数会根据窗口句柄查找到对应的CWnd对象。然后调用AfxWndCallProc(),调这个函数的作用是为了把这个消息保存下来备用(为了后面DefWinProc()用)然后就调用CWnd对象的WindowProc()函数(从此时开始的所有函数可以OverWrite),WindowProc()函数会调用OnWndMsg()来处理消息,要是OnWndMsg()没有处理消息,它会调用DefWinProc()来处理(此处的包装使得好像是CWnd的WindowProc()是注册的消息处理函数),OnWndMsg()函数会判断消息的类型,如果是一个OnCommand消息,它会调用OnCommand()函数来处理,如果是OnNotify消息,它会调用OnNotify()函数来处理,这两个函数都会先试着把消息映射回控件类(CButton如果有的话),如果控件类不处理这个消息,那么因为这个消息已经是命令消息,不是窗口消息,已经不是专属于窗口来管了。它就调用CcmdTarget类的OnCmdMsg()函数来处理(当然窗口也可以处理),OnCmdMsg()函数会查找消息映射或者进行消息传递。所有没有被传入OnCommand或OnNotify的都被认为是窗口消息,直接在本CWnd的消息映射中查找消息处理函数,要是找不到就返回WindwoProc()让DefWinProc()来处理它。
相关文章推荐
- ADO 事件模型范例 (VC++)
- VC 线程模型 初始化 、销毁 、驱动,事件与临界区
- ADO 事件模型范例 (VC++)
- javascript中0级DOM和2级DOM事件模型浅析
- 浅析ADO 事件模型
- [转].Net 事件模型教程(三)
- 仿net事件委托的java事件模型实现
- W3C的标准DOM事件模型和IEDOM事件模型的区别
- VC 为静态控件添加事件(修改ID号以后添加事件)
- 事件冒泡 模型
- Agile Framework功能介绍(2):框架事件模型
- Javascript事件模型系列(一)事件及事件的三种模型
- 基于管道化和事件驱动模型的Web请求处理(一)
- 【jQuery学习笔记-----Window事件模型】
- 使用.NET事件模型通知文件拷贝进度
- 在VC 程序中自定义Vista事件日志
- 深入浅出话窗体(一)——窗体事件模型(上)
- 深入浅出话窗体(一)——窗体事件模型(上)
- 深入探讨vc下C++模板编译模型
- 关于js中的单线程和异步事件同操作系统的生产者消费者模型的理解