win32 实现一个应用程序:
设计 注册 创建 显示 更新 消息循环
消息: 操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序。
MFC 类库把功能封装成类,然后把许多全局函数制作成文件在链接过程中链接到程序中,完成整个程序的链接...
所以,MFC程序的入口函数是WinMain函数。
CWinApp theApp;//代表应用程序本身... 全程序有且只有一个theApp对象.
________________________________________________
消息处理及路由分析:
程序在后台维护着一个c++资源的句柄和类对象的映射表。。
当有消息到来时,编译器会通过映射表把消息和相应的类关联,通过消息循环最终调用WindowProc函数,对消息处理。。。实现OnCmdMsg实现消息处理
每个类都会有一个如下的消息关联表(消息与处理函数的关联表) 。于是,就遍历其关联表找到处理函数执行。如果没有找到,那么就牵涉到消息路由的问题。
消息处理:
BEGIN_MESSAGE_MAP
END_MESSAGE_MAP
消息路由:
OnCmdMsg的处理过程分析:
系统把消息分为三类:1、标准消息(WM_CREATE、WM_DRAW等等);2、命令消息(也就是菜单消息);3、通告消息(WM_Notify);
a、处理标准消息时,如果不能在关联类中找到处理函数,那么只会在其基类中去路由。路由顺序:CView-->CFrameWnd-->CCmdTarget
b、处理命令消息时,路由顺序:CView -->CDocument-->CFrameWnd-->CWinApp-->CCmdTarget
__________________________________________________
消息映射与虚函数实现的分析
为什么没有用虚函数实现消息映射,而用消息宏实现消息映射?
1、侯捷所言:内存的消耗考虑;
2、可扩展性的考虑,因为以后如果有新的消息加入,那么需要修改类库源码,而这个宏机制实现就不存在这个问题;
3、管理的考虑。如果用虚函数实现,那么需要为每个类添加其所有的消息响应函数,但是实际上程序中每次只需要用到许多消息中的少几种消息即可,这样虚函数实现会存在大量的浪费问题,而宏机制实现就不在这个问题。