VC的事件模型

博客介绍了VC的事件模型,指出所有窗口在操作系统中由预先注册的窗口类这一数据结构维护,一个窗口类可有多个实例,且该窗口类有重要成员,即对应的窗口事件处理函数的地址。

VC的事件模型

所有的窗口在操作系统中都以一个数据结构维护着,这个数据结构就是预先注册的窗口类,一个窗口类可以有多个实例,这个窗口类有一个重要的成员:对应的窗口事件处理函数的地址。

MFC中,所有窗口的这个函数地址都被注册成为AfxWndProc(),这个全局函数会根据窗口句柄查找到对应的CWnd对象。然后调用AfxWndCallProc(),调这个函数的作用是为了把这个消息保存下来备用(为了后面DefWinProc()用)然后就调用CWnd对象的WindowProc()函数(从此时开始的所有函数可以OverWrite),WindowProc()函数会调用OnWndMsg()来处理消息,要是OnWndMsg()没有处理消息,它会调用DefWinProc()来处理(此处的包装使得好像是CWndWindowProc()是注册的消息处理函数),OnWndMsg()函数会判断消息的类型,如果是一个OnCommand消息,它会调用OnCommand()函数来处理,如果是OnNotify消息,它会调用OnNotify()函数来处理,这两个函数都会先试着把消息映射回控件类(CButton如果有的话),如果控件类不处理这个消息,那么因为这个消息已经是命令消息,不是窗口消息,已经不是专属于窗口来管了。它就调用CcmdTarget类的OnCmdMsg()函数来处理(当然窗口也可以处理),OnCmdMsg()函数会查找消息映射或者进行消息传递。所有没有被传入OnCommandOnNotify的都被认为是窗口消息,直接在本CWnd的消息映射中查找消息处理函数,要是找不到就返回WindwoProc()让DefWinProc()来处理它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值