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