MFC学习(七)单文档程序
- 格式:pdf
- 大小:123.48 KB
- 文档页数:2
MFC学习(七)单⽂档程序
1 MFC单⽂档程序的主要类
(1)⽂档类(Document)
即应⽤程序处理的数据对象,⽂档⼀般从 MFC 中 CDocument 中派⽣。CDocument 类⽤于相应数据⽂件的读取以及存储 Cview 类所需要
观察和处理的信息。
(2)视类(View)
视相当于⽂档在应⽤程序中的观察窗⼝,它确定了⽤户对⽂档的观察⽅式和⽤户编辑⽂档的⽅式。对于图形来说视就好⽐我们进⾏绘图⼯作
的画布,对图形的操作都是在视上进⾏的。另外,视类中有⼀个重要的成员函数 OnDraw() 函数。重载的 OnDraw() 函数要完成两件事,即
调⽤相应的⽂档的函数获取⽂档数据和调⽤ GDI 图形设备接⼝的函数在视中画出⽂档数据。
(3)主窗⼝类(Main Frame Window)
主窗⼝是 Windows 应⽤程序中限定其所有窗⼝范围的最外边框。应⽤程序中的所⽤其它窗⼝都直接或间接地为主窗⼝的⼦窗⼝,视占⽂档
窗⼝的客户区,⽽⽂档窗⼝⼜是主窗⼝的⼦窗⼝。
(4)⽂档模板类(Document Template)
⽂档模板类⽤于协调⽂档对象、视对象、和主窗⼝对象的创建过程。它是从类 CDocTemplate 或其派⽣类中派⽣的。⼀个⽂档模板可以管理
同⼀⽂档类型的所有⽂档。
(5)应⽤类(Application)
⼀个应⽤程序有且只有⼀个应⽤类的对象,它控制上述所有的对象。⼀个应⽤程序对象就代表⼀个应⽤程序,当⽤户启动应⽤程
序,Windows 调⽤应⽤程序框架内置的 WinMain 函数, 并且 WinMain 寻找⼀个由 CWinApp 派⽣的全局构造的应⽤程序对象,全局对象
在应⽤程序之前构造。
(6)图形设备接⼝PC 相容机种上可以连接许多种不同的视讯设备,所以 GDI 的主要⽬的之⼀是⽀援与设备⽆关的图形。⼀个 Windows 图形设备接⼝对象类
型由⼀个 MFC 类库表⽰,这些类有⼀个共同的抽象基类:CGdiObject。其中有如下⼀些对象:CBitmap 位图对象,⽤于表⽰位图
CBrush 画刷对象,⽤于表⽰区域填充的颜⾊和样式
Cpen 画笔对象,⽤于指定线和边框的性质,如颜⾊、线宽、线性等
CRgn 区域对象,由多个多边形和椭圆组成的组合形状,可以填充、裁剪等操作以及判断⿏标是否位于某⼀点。
CFont 字体对象,具有⼀定⼤⼩和风格的⼀套字符集。
CPalette 调⾊板对象,是⼀字符映射表, 将逻辑颜⾊和设备的实际颜⾊相互联系。
(7)设备环境类
设备环境类 CDC 的内容⼗分丰富,包含了和绘图有关的⽅⽅⾯⾯。CDC 类提供的成员函数可以⽤于对设备环境的操作、绘图⼯具的使⽤、
图形设备接⼝ GDI 对象的选择等。但在使⽤ CDC 类对象视时应注意⼀个问题:为使⽤ CDC 对象,须先构造⼀个 CDC 对象,然后才能调
⽤它的成员函数。使⽤完成后,必须在适当的⽅将其删除,在 Windows 环境中可获得的设备环境的数量是有限的。
2 创建单⽂档应⽤程序⼀般步骤
利⽤AppWizard创建应⽤程序框架
在⽂档内声明保存⽂档数据所需要的数据对象。
完成⽂档类的onNewDocument函数,初始化新⽂档。
完成⽂档类的Serialize函数,保持和加载⽂档数据。
完成视图类的OnInitialUpdate函数,初始化显⽰
完成视图类的OnDraw函数,显⽰当前⽂档内容
在视图类中加⼊可以使⽤户编辑⽂档数据所需的代码
3 每个类的关键函数
4 MFC单⽂档框架理解
MFC程序的整个运⾏机制需要经过:设计窗⼝类,注册窗⼝类,创建窗⼝,显⽰并更新窗⼝,消息循环。
C*App类的InitInstance()完成应⽤程序的⼀些初始化⼯作,包括窗⼝类的注册、创建,窗⼝的显⽰及更新。
C*App类的InitInstance()的代码
CSingleDocTemplate* pDocTemplate; //定义单⽂档模板对象指针
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMFCSingleDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CMFCSingleView));
AddDocTemplate(pDocTemplate); 该单⽂档模板对象把⽂档对象、框架对象、视类对象有机的组织到⼀起。
C*App类的AddDocTemplate(pDocTemplate);//把单⽂档模板添加到⽂档模板中5 关键点
CmainFrame类:是程序的框架类,起到了⼀种容器的作⽤,这个容器中可以有多个视图,菜单,⼯具等。注意:在mainFrame响应
OnPaint消息,⾃然是可以响应的,但是会看不到绘制内容。应该在View中响应OnPaint消息。
在SDI(单⽂档)界⾯中,菜单响应遵循这样⼀个顺序:菜单消息先由CMainFrame类接收,CMainFrame并不直接在内部寻找对应的相应函
数,⽽是到CView类寻找。如果CView类有该消息的响应函数,那么就直接调⽤CView类中的响应函数,否则,转到CDoc类寻找,如果CDoc类中存在该消息的响应函数,那么就直接调⽤CDoc类中的响应函数,否则,返回到CMainFrame类寻找。如果CMainFrame类中也没
有,返回到CApp类中寻找。如果在CApp类中也没有找到,表⽰没有该菜单的响应函数。
1. 在CmainFrame中访问Cview对象和Cdoc对象
要访问这两个对象可以使⽤全局函数GetActiveDocument()和GetActiveView()这样可以获得Doc对象和View对象的实体了
2. 在CmainFrame中调⽤Cview对象更新窗⼝,这⾥使⽤⽅法如下:GetActiveView()->Invalidate(FALSE);// 这⼀句会是cview调⽤OnDraw消
息响应函数
GetActiveView()->UpdateWindow();//这句可以加上也可以不加,暂时没有发现不加会出现什么问题。
3 在Cview内中要获取到CmianFrame可以使⽤下⾯的函数:AfxGetMainWnd()
3 取得doc对象
在Cmianframe中可以使⽤GetActiveDocument()‘;
在Cview类中包含了⼀个Cdocument的对象m_pDocument这个对象即使指向Doc类的基类对象的,⽽要实现基类对象到现在doc类对象的转
换只要添加如下函数即可
inline CStockAppDoc* CStockAppView::GetDocument()
{ return (CStockAppDoc*)m_pDocument; }
则可以实现。
4 在视图(CView)中访问框架(CFrameWnd) CFrameWnd* GetParentFrame() const;
5 在⽂档(CDocument)中访问框架(CFrameWnd)
CWnd* AfxGetMainWnd();
CWnd* AfxGetApp()->m_pMainWnd;
6