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 ()来处理它。