MFC中单文档程序框架
来源:互联网 发布:linux审计日志分析 编辑:程序博客网 时间:2024/05/21 17:59
1. 应用类及全局对象(CExampleApp)
theApp 是唯一一个在程序形成的时候就存在的全局变量,CExampleApp类继承于CwinApp类,MSDN中CwinApp的继承关系如下
从继承关系当中,我们发现theApp是作为程序的实体而存在的,是单文档程序的核心。应用类封装了Windows应用的初始化,运行以及终止的全过程。对于每一个基于框架的应用,它必须有一个且只能有一个派生于CWinApp的类对象。这个对象是全局对象,因此它在创建任何窗口前首先被构造。类CWinApp提供了几个关键的可重载的虚成员函数,他们是InitInstance,Run,ExitInstance以及OnIdle等。而且,在程序中可以随时调用全局函数AfxGetApp,以便获得CWinApp类对象的指针。BOOL C ExampleApp ::InitInstance()这个函数,包含了单文档程序中重要的信息,特别要提到的是一下的一段代码:
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CExampleDoc),
RUNTIME_CLASS(CMainFrame),
if (!pDocTemplate)
AddDocTemplate(pDocTemplate);
接下来对剩下的三个类对象做分析
2.
3.视图类(CExampleView)
该类占有框架窗口的客户区,主要负责显示文档数据,也为文档对象和用户之间提供了用以交互的可视接口,另外,也完成了与文档打印相关的操作,通常,一般的绘制操作都是在该类中完成,因此有时也称视图类窗口为“绘制窗口”。
要注意的有几点,第一,因为mianfram是没有视图的,因此如果在mainframe相应Onpaint消息,自然是可以响应这个消息的,但是在绘制当中如何也不会出现预想的绘制内容,为什么呢? 嘿嘿,可以想象一下你在一个 word程序里面,当你关闭了所有的白板(视图)的时候,你会发现你已经无法在编写文字,道理是一样的,在mainframe里面进行绘制,程序是没有问题,但是绘制的内容是在灰色上面,windows不予显示的。
第二点你可以发现在对菜单,和工具条的单击消息进行相应的时候你可以将消息响应函数添加到cmainframe也没有将消息响应函数调价到cview当中,但是你会惊奇的发现,两者只在一个地方相应的时候,消息响应函数没有问题都能正确的执行,但是如果同时对一个按钮或者菜单进行单击消息响应的时候,你会发现windows会执行的Cview里面的消息响应函数。具体消息路径会在下面叙述。
文档类实际上是一种数据结构,该类实现了对这种结构的封装以利于管理,通常,它不但包含应用中所需的数据,而且也包含了处理这些数据的方法,另外,文档类还可以为应用提供与其存储的数据相关的服务。
在CMianFrame中可以使用GetActiveDocument()
在Cview类中可以使用:这里要注意一点,在Cview类中包含了一个Cdocument的对象m_pDocument这个对象即使指向Doc类的基类对象的,而要实现基类对象到现在doc类对象的转换只要添加如下函数即可
inline
5.“关于”对话框类(CAboutDlg)
该类封装了用于显示软件版本,版权等相关信息的“关于”对话框,通常不需要对它进行任何的编程。而只需要使用对话框资源编辑器对对话框模板进行简单的编辑即可。
6. 其他说明:
1) 消息路径如下:
在SDI(单文档)界面中,菜单响应遵循这样一个顺序:菜单消息先由CMainFrame类接收,CMainFrame并不直接在内部寻找对应的相应函数,而是到CView类寻找。如果CView类有该消息的响应函数,那么就直接调用CView类中的响应函数,否则,转到CDoc类寻找,如果CDoc类中存在该消息的响应函数,那么就直接调用CDoc类中的响应函数,否则,返回到CMainFrame类寻找。如果CMainFrame类中也没有,返回到CApp类中寻找。如果在CApp类中也没有找到,表示没有该菜单的响应函数。
2)
CView*
应该这样写:((CMouseKeyView*)GetActiveView())->MyFunc();
3)主框架(CFrameWnd)中访问文档(CDocument):
4)在视图(CView)中访问文档(CDocument):
inline
CFrameWnd*
CWnd*
UpdateAllViews
功能:通知所有的视图文档已被修改的信息
原型:
void
LPARAM
CObject*
8)在其他类中访问文档类(CDocument)
CDocument*
CFrameWnd*
CDocument*
ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CMouseKeyDoc)));
return
7.MFC程序流程小结
1)Windows将用户程序装入内存
2)构造全局对象theApp,在程序被装入时,所有全局对象都会立刻被创建。
3)Windows调用全局函数WinMain,它是类库的惟一实例
4)WinMain里面只调用函数AfxWinMain
5)AfxWinMain执行AfxWininit,调用AfxinitThred,接着
6)AfxWinMain执行InitApplication,然后执行Initinstance,Initinstance是CWinApp的虚函数,在此改写。
7)InitInstance函数里面启动文档的装入以及主要框架和视图显示处理过程。
8)在这里new 一个CMyFrameWnd ,CMyFrameWnd构造函数调用Create产生主窗口
9)InitInstance 执行ShowWindow,UpdateWindow,发出WM_PAINT
10)WinMain调用theApp的Run函数,它启动窗口消息和命令消息的传递处理过程。
11)单击file/close,则发出WM_CLOSE
12)CMainFrame交默认处理
13)调用::DestroyWindow发出WM_DESTROY
14)默认处理调用::postQuitMessage 发出WM_QUIT
15)CWinapp::Run收到WM_QUIT结束内部循环,调用ExitInsance(若CCExcmpleApp改写 Exitinstance,则调用CCExcmpleApp::ExitInstance;
16)ExitInstance函数负责完成应用程序结束之前的清除工作。
17)ExitInstance函数返回时,Run函数也返回了,MFC完成了一些清除工作,Windows终止应用程序
18)回到AfxWinMain,执行AfxWinTerm,程序结束!!
- MFC中单文档程序框架
- MFC中单文档程序框架
- MFC中单文档程序框架
- MFC单文档程序中搭建OpenGL框架
- MFC单文档程序中搭建OpenGL框架 .
- MFC单文档程序中搭建OpenGL框架
- MFC--单文档程序(框架)
- MFC中 单文档程序 删除工具栏
- 如何手动写一个MFC单文档程序框架
- MFC单文档框架理解
- MFC单文档程序流程
- MFC在单文档程序中添加最近打开文件.
- MFC+Opencv在单文档程序中显示出一幅图像
- MFC中给单文档程序添加背景图片
- 深入剖析MFC基础框架——跟踪MFC单文档程序的执行过程:
- OpenGL创建MFC单文档框架
- MFC 单文档框架最大化显示
- 基于MFC单文档SDI的OpenGL图形程序的基本框架
- 关于16年2月14日以后上传AppStore出现:Missing iOS Distribution signing identity for...的问题
- ZOJ 3582 概率DP
- eclipse运行jsp时tomcat服务器报错解决
- [Android 动画] 实现类似弹簧的插值器SpringInterpolator
- Linux下svn密码问题
- MFC中单文档程序框架
- centos下网络配置方法(网关、dns、ip地址配置)
- lucene
- VS2008中OGRE1.7.4下配置Hydrax-v0.5.1插件
- apktool使用
- [.Net码农]C# WebService异步处理/异步调用详解
- linux正则表达式入门及文件操作命令进阶
- 在Windows下搭建Android开发环境
- SQL2005 性能监视器计数器错误解决方法