一、在MFC中消息有三种类型,分为标准消息,命令消息,通告消息。他们的区别如下:
1、标准消息:
(1)除WM_COMMAND之外,所有以WM_开头的消息。
(2)从CWnd派生的类,都可以接收到这类消息。
2、命令消息:
(1)来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。
(2)从CCmdTarget派生的类,都可以接收到这类消息。
3、通告消息:
(1)由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。
(2)从CCmdTarget派生的类,都可以接收到这类消息。
至于哪些类是从CWnd类派生出来的呢?我们可以把它的类名复制下来,在MSDN上搜索一下,就可以看到它所继承的父类,就能判断它是否从CWnd类派生。工具栏,控件等都是从CWnd类派生的类。
在一个单文档MFC程序中,CMainFrame类与View类是从CWnd类派生出来的,而App类和Doc类则不是从CWnd类派生出来的,但它们都派生自CCmdTarget类。而CWnd类也是从CCmdTarget类派生而来。
菜单属于框架窗口类,点击菜单下的按钮时,会先到View类中查找相关的消息处理函数,若找不到,就把消息传送给Doc类。若在Doc类中找不到相关的消息处理函数,Doc类会把消息返转给View类,由View类来作处理。此时View类会把消息传给CMainFrm类,若在CMainFrm类中还是找不到相关的消息处理函数,同样CMainFrm类会把消息返转给View类,由View类来作处理。最后,View类会把消息传给App类,让App类来处理该消息。
单文档项目:
在WinMain执行前初始化的全局变量theApp、调用WinMain函数、注册窗口、产生窗口、建立消息循环、窗口过程、窗口的销毁
在SDI(单文档)界面中,菜单响应遵循这样一个顺序:菜单消息先由CMainFrame类接收,CMainFrame并不直接在内部寻找对应的相应函数,而是到CView类寻找。如果CView类有该消息的响应函数,那么就直接调用CView类中的响应函数,否则,转到CDoc类寻找,如果CDoc类中存在该消息的响应函数,那么就直接调用CDoc类中的响应函数,否则,返回到CMainFrame类寻找。如果CMainFrame类中也没有,返回到CApp类中寻找。如果在CApp类中也没有找到,表示没有该菜单的响应函数。
同时CmainFrame作为整个程序的框架,它提供了程序运行的基础环境,这里再强调介绍一下两点
1. 在CmainFrame中访问Cview对象和Cdoc对象
要访问这两个对象可以使用全局函数GetActiveDocument()和GetActiveView()这样可以获得Doc对象和View对象的实体了
2. 在CmainFrame中调用Cview对象更新窗口,这里使用方法如下:GetActiveView()->Invalidate(FALSE);// 这一句会是cview调用OnDraw消息响应函数
GetActiveView()->UpdateWindow();//这句可以加上也可以不加,暂时没有发现不加会出现什么问题。
转载出处:
http://blog.csdn.net/ljianhui/article/details/8782068
http://blog.csdn.net/ljianhui/article/details/8781991
http://www.cnblogs.com/HappyXie/archive/2011/05/06/mfc.html