MFC文档视图(二):标准消息

来源:互联网 发布:mysql trigger 编辑:程序博客网 时间:2024/06/15 20:10


 

前面有讲到MFC文档视图框架中比较关键的5个类.CWinApp,CDocument,CView,CFrameWnd,CSingleDocTemplate

程序一启动,5个类就全部有被实例化.不过代码中只能看到CWinApp和CSingleDocTemplate两个类的实例化.其他3个封装在一些父类的操作中,我们看不到了.也不用去管.只管拿来用就行.我们知道类一旦实例化之后就被调用对象的成员变量和函数了.

5个类之间的关系

1.CWinApp 创建CSingleDocTemplate,并有一个指针指向它

2.CSingleDocTemplate 创建CDocument,和CFrameWnd,并有两个指针分别指向它们

3.CFrameWnd 创建CView,并有指针指向它

4.CDocument 中有指针指向CView

5.CView 类中有指针指向CDocument

 

windows的上的程序运行是基于消息处理的.也就是没有啥消息传过来(比如用鼠标去点它或键盘操作发送消息过去)那程序就静静的呆那里不动的.而一有消息来了就调用某个函数去处理,去处理消息的函数叫回调(callback)函数,是由操作系统而不是应用程序自己去调用该函数.

 消息分类

windows消息分为三类

1.标准消息:

除WM_COMMAND之外所有以WM开头的消息.比如WM_CREATE,在MFC中就对应的宏是ON_WM_CREATE();

2.命令消息

来自菜单栏,快捷键,工具栏按钮的消息.MFC中对应的宏是ON_COMMAND(ID_XXX, CallBackFunction);

例如ON_COMMAND(ID_FILE_OPEN, OnFileOpen)

3.通知消息:

由控件产生的消息.

 

 有时也把2,3类消息统称为非标准消息.

只有继承自CWnd的类可以处理标准消息.(2,3类消息自然也能处理).CView和CFrameWnd就是继承自CWnd.

继承自CCmdTarget的类可以处理第2和第3类消息.我们前面讲到5种关键的类都是继承自CCmdTarget.

 

5种常见标准消息

常见的标准消息有WM_CREATE, WM_CLOSE, WM_DESTROY, WM_SIZE, WM_PAINT

标准消息只能由继承自CWnd的类处理.上面的消息涉及到窗口的创建,关闭,销毁,窗口大小调整,颜色调整.

像CView,CFrameWnd, CDialog类都是一个个的窗口,它们创建和关闭肯定是由自己来处理.在MFC中通过一些宏指定一个函数来处理这些消息.

 

标准消息在MFC中的处理

 

1.WM_CREATE

对应宏ON_WM_CREATE(), 然后写个函数afx_msg void OnCreate()来做相应的处理,注意这个函数名是定了的,可不能改的.

该消息是指窗口创建(实际上是显示之前)时发出,所以OnCreate就是在窗口显示之前做些初始化设置.窗口的创建应该是实例化一个窗口类,debug时看到肯定是先调用构造函数,然后才调用到OnCreate函数的

2.WM_CLOSE

对应宏ON_WM_CLOSE(),再定义个函数afx_msg void OnClose();

 

3.WM_DESTROY.

对应宏ON_WM_DESTROY(),再定义个函数afx_msg void OnDestroy();

 

OnClose与OnDestroy关系

close是关闭窗口,destroy是销毁窗口.关闭窗口跟隐藏窗口很类似(只不过完全看不到了,但拥有的资源没被释放).destroy是真正的销毁窗口释放资源.
一般的调用顺序是这样:

(1).用户点击关闭发送WM_CLOSE消息,然后OnClose函数做相应处理,例如你可能弹出对话框问用户是否确定关闭不.如果点否定就没关闭窗口又返回原样.如果确定则调用DestroyWindows().

(2).DestroyWindows中发送WM_DESTROY消息

(3).处理WM_DESTROY消息,并调用PostQuitMessage(),发送WM_QUIT消息.结束消息循环.

 

所以要让一个窗口正常销毁可以先调用OnClose然后接着接着一连串处理,也可以不调用它直接调用OnDestroy.

 

4.WM_SIZE

窗口大小改变时发出的消息.对应的宏是ON_WM_SIZE().对应的处理函数是

afx_msg void OnSize(UINT nType, int cx, int cy);

其中cx,cy自然是窗口的横坐标与纵坐标.nType指窗口改变时的类型,比如有SIZE_MAXIMIZED 就是指窗口被最大化.

 

5.WM_PAINT

对应的宏是ON_WM_PAINT,对应的处理函数是afx_msg void OnPaint();

OnSize是指改变窗口大小,OnPaint就是处理颜色相关的操作.OnSize的操作一般会调用RedrawWindow,它再发出一个WM_PAINT消

0 0
原创粉丝点击