MFC学习笔记----文档类
MFC高级编程学习笔记

No.3 /*SystemParametersInfo*/
//设置桌面壁纸
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,lpPath,0);
//屏蔽掉系统键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);
(4)获取函数指针:PFUNC pFunc=(PFUNC)GetProcAddress(hdll,"函数名");
(5)调用函数后,释放DLL:FreeLibrary(hdll);
3.资源的导入使用(显式链接,以菜单导入为例)
(1)进行1中的步骤(1)(2);
(2)载入DLL库:HINSTANCE hdll=LoadLibrary("*.dll");
原型:
WINSHELLAPI HINSTANCE APIENTRY ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);
2.文件删除:
BOOL DeleteFile(LPTSTR lpFileName);
3.文件复制:
BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists);其中参数bFailIfExists告诉系统当目标文件存在时如何操作,当bFailIfExists为true时,如果目标文件存在,则函数执行失败;当bFailIfExists为false时,如果目标文件存在,则覆盖目标文件。
MFC学习笔记

MFC程序也有一个WinMain函数,这个函数是我们在编译链接的时候由链接器将WinMain函数链接进来的。
这个函数在APPMODUL.CPP中。
带有Afx的属于应用程序框架类的函数,应用程序框架是辅助我们生成应用程序的框架模型,这个框架模型把很多类或者类与类之间做了一个有机的集成提供给我们,我们可以根据框架模型提供的类库来设计我们自己的应用程序,Af即Application frame 看看这些类如何和我们WinMain函数关联到一起的?CmainFrame的名字是不会变的,其它的都是C+工程名+App/Doc/View命名。
class CTestApp : public CwinApp,可以看到CtestApp是从CwinApp派生出来的。
当我们双击CtestApp这个类时,我们可以看到VC++6.0上面显示我们进入了Test.h头文件中,当把CtestApp展开时,然后双击任何一个函数名,包括构造函数名,析构函数名…我们可以看到VC++6.0上面显示我们进入了Test.cpp源文件中。
且这种情况和我们直接从Fileview 资源卡中直接进入相应的头文件和源文件是一样的效果。
其它类也是相似的操作进入头文件和源文件。
不管是全局变量还是在全局对象CTestApp theApp;,它们都是在程序运行之前,也就是在入口函数WinMain函数加载之前,就已经为它们分配好了内存空间,作为全局函数,就要调用构造函数创建内存空间。
所以是先运行全局对象CTestApp theApp,调用它的构造函数,然后才运行WinMain。
为什么要定义一个全局对象呢?为什么要让它在WinMain之前完成呢?全局对象theApp又有什么作用?CtestApp是从CwinApp派生出来的,theApp是应用程序对象,是一个全局对象,每一个MFC程序当中有且仅有一个从CwinApp派生出来的类,也只能有一个应用程序类实例化的对象,它就表示了我们应用程序本身。
孙鑫MFC最全完整笔记

第一课1.MFC生成的C++源文件中都有StdAfx.h,此文件包含了常用的AFX函数的声明,其中有afxwin.h,此文件包含了CRECT,CPoint,CWnd等许多类及其方法的声明。
2.Project->Setting->Debug可以加入命令行参数。
3.在SDK中要加入"windows.h"和stdio.h。
因为LoadCursor,MessageBox等函数的声明在这个文件中。
4.创建一个完整的窗口的四个步骤SDK,1设计窗口类,2注册窗口类,3创建窗口,4显示窗口5.函数名可以代表函数代码的首地址,即可作为函数指针。
6.要查看VC数据类型,可以在MSDN中输入“BOOL”然后选择“DATA TYPE”。
7.atof将字符串转化为float,atoi将字符串转化为int型。
8.所有从CWnd类派生的类都有m_hWnd句柄。
9.变量的生命周期:可以认为出了包含它的大括号,这个变量的生命周期结束。
所以全局变量的声明位于所有大括号之外。
但是用new声明的变量和用static声明的变量除外。
10.SDK示范程序,见下面。
11.sprintf格式化字符,其头文件为stdio.h,在MFC中格式化字符用CString.Format12.GetDC()与ReleaseDC()要成对使用,否则会内存泄漏。
同样,BeginPaint()与EndPaint()。
13.GetStockObject()得到画笔、画刷、字体、调色板的句柄,使用时必须用类型转换。
14.什么时候用NULL,什么时候用0.答,对指针赋值时用NULL,对变量赋值时用0.15.什么是野指针?答:将指针指向的变量的内存释放后,此指针即变成野指针!如何避免野指针?答:将此指针指向NULL即可。
p=NULL;16.SDK代码流程:#include "windows.h"//包含头文件LoadCursor,TextOut等函数#include "stdio.h"//包含sprintf,printf等函数LRESULT CALLBACK MyProc(...);//声明回调函数int WINAPI WinMain(){WNDCLASS wndcls;//设计窗口类wndcls.hcursor=LoadCursor();//初始化....RegisterClass(&wndcls);//注册窗口类hwnd=CreateWindow(...);//创建窗口ShowWindow(..);//显示窗口UpdateWindow(..);MSG msg;//定义消息结构体while(GetMessage(...))//消息循环{...}return 0;}LRESULT CALLBACK MyProc(...)//实现回调函数{switch(uMsg){case WM_CHAR:break;...}}第2课1.定义结构体和类时别忘记在最后加入";"号!例如Class Point{int x;int y;};2.#include <xxx.h>与#include "xxx.h"的区别:<>不查找运行时目录,""查找运行时目录!3.类的定义中,如果未指明成员类型,则缺省为private.而结构体中则缺省为public.4.引用:引用经常用在函数的传参上。
MFC学习(七)单文档程序

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。
MFC知识点(自己整理的,只供参考)

知识点:不是很全面,只供参考第一章Windows应用程序使用的界面是由各种图形元素组成的图形界面(GUI)。
Windows提供了大量预定义的用C语言编写的函数,这些函数就叫做API(Application Programming Interface)函数。
在Windows应用程序中,存在着许多与DOS应用程序不同的复杂对象,例如窗口、按钮、滚动条等等。
Windows把为这种复杂对象所定义的标识叫做句柄。
常用的句柄类型:HWND 窗口句柄,HDC 图形设备环境句柄,HINSTANCE 当前程序应用实例句柄,HBITMAP 位图句柄,HICON 图标句柄,HCURSOR 光标句柄,HBRUSH 画刷句柄,HPEN 画笔句柄,HFONT 字体句柄,HMENU 菜单句柄,HFILE 文件句柄事件的描述是一个消息消息的结构:typedef struct tagMSG{HWND hwnd; //产生消息的窗口句柄UINT message;//消息的标识码WPARAM wParam;//消息的附加信息1LPARAM lParam;//消息的附加信息2DWORD time; //消息进入消息队列的时刻POINT pt; //表示发送该消息时鼠标的位置}MSG;消息循环:while(GetMessage(&msg,NULL,NULL,NULL))//系统处理了消息后返回{TranslateMessage(&msg);//把键盘消息翻译成字符消息DispatchMessage(&msg);//把消息派发给Windows系统创建窗口的三个步骤:注册窗口类:RegisterClass(&wc);创建窗口:hwnd=CreateWindow( lpszClassName,"Windows",WS_OVERLAPPEDWINDOW,120,50,800,600,NULL, NULL, hInstance,NULL);显示窗口:ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);大题:用函数封装Windows程序(P16)第二章类封装:窗口类:class CFrameWnd{public:HWND hWnd;///数据成员public:int RegisterWindow(); //定义及注册窗口类void Create(LPCTSTR lpClassName,LPCTSTR lpWindowName);//创建窗口void ShowWindow(int nCmdShow);//显示与更新窗口void UpdateWindow();};应用程序类:class CWinApp{public:CFrameWnd*m_pMainWnd;//以窗口类的对象作为数据成员public:BOOL InitInstance (int nCmdShow);//在初始化函数中创建及显示窗口int Run();//消息循环};窗口函数的封装——消息映射用DECLARE_MESSAGE_MAP来声明消息映射表用BEGIN_MESSAGE_MAPBEGIN_MESSAGE_MAP(类名称,基类名称)ON_XXXX 例ON_WM_PAINT()END_MESSAGE_MAP来实现消息映射表大题:类封装Windows应用程序第三章应用程序的框架由两个对象组成:应用程序类CWinApp的派生类对象和框架窗口类CFrameWnd的派生类对象,后者作为一个成员对象嵌在前者之中。
MFC文档视图

应用程序对象
- 10 -
文档/视图框架—文档视图对象的创建过程
...... //注册应用程序的文档模板。 //文档模板将用作文档、框架窗口和视图之间的连接 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMytestDoc), RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口 RUNTIME_CLASS(CMytestView)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); //分析标准外壳命令、DDE、打开文件操作的命令行 ...... //根据命令行中的信息启动程序 ......
-3-
文档/视图框架—文档/视图结构概述
框架口
文档
文档当前可视部分
文档和视图的关系
-4-
文档/视图框架—文档/视图结构概述
使用文档/视图结构的意义:
将数据操作、数据显示和用户界面分离开。这是一种“分而治之” 的思想,这种思想使得模块划分更加合理、模块独立性更强。
MFC在文档/视图结构上提供了许多标准操作。如新建文件、打 开文件、保存文件、打印等操作,它们被框架自动完成,减轻了 程序员的工作量。
-7-
文档/视图框架—单文档主要类
单文档应用程序框架中,主要包含5个类:
SDICWinApp(应用程序类) CFrameWnd(框架窗口类) CView(视图类) CDocument(文档类) CDocTemplate(类文档模板)
MFC部分复习整理

MFC部分复习整理一Windows SDK 程序:使用软件开发工具包开发出来的Windows 应用程序。
Windows 应用程序:以Windows 作为平台运行的应用程序。
Windows API函数:用来开发Windows SDK的软件开发工具包是由C语言编写的一个大型函数库,这个库中的函数就是API函数。
Windows API函数的三大类型及其功能:(1)窗口函数:实现窗口的创建、移动和修改等功能。
(2)图形设备函数:实现图形的绘制及操作功能。
(3)系统服务函数:实现与操作系统有关的一些功能。
事件:能触发程序作出相应反应的因素或动作。
如鼠标的单击、在键盘上按下一个键等。
消息循环:在创建了窗口的应用程序中,应用程序将不断地从消息队列获取消息,并将消息指派给指定的窗口处理函数来处理,然后再回来从消息队列中获取消息,这个循环工作的过程叫消息循环。
Windows应用程序的主函数的三个主要任务:注册窗口类创建应用程序的窗口建立消息循环。
Windows 系统、主函数、窗口函数之间的关系:主函数和窗口函数都是由Windows 系统调用的函数,只不过主函数是程序启动之后,系统首先调用的函数,而窗口函数是主函数在获得消息并把消息发给系统之后,由系统依据产生事件的窗口所使用的窗口类型提供的函数指针调用的函数。
二消息映射表:描述了整个应用程序的消息和消息处理函数的对应关系的总表。
消息映射表的声明:DECLARE_MESSAGE_MAP (用来声明消息映射表的宏)消息映射表的实现:控件种类不同,方式不同控件为按钮控件(button)的单击事件消息映射宏的实现:ON_BN_CLICKED(<消息标识>,<对应的消息处理函数>)控件组合控件(ComboBox)的双击事件消息映射的实现宏:ON_CBN_DBLCLK(<消息标识>,<对应的消息处理函数>)控件为文本编辑框控件(Edit)的双击事件消息映射的实现宏:ON_EN_DBLCLK(<消息标识>,<对应的消息处理函数>)窗体类CFrameWnd中需要封装的成员:窗口句柄、窗口类的定义、注册窗口类、创建窗口、显示更新窗口。
MFC单文档及其简介

MFC是一个编程框架MFC中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序。
MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法。
AppWizard可以用来生成初步的框架文件。
资源编辑器用于帮助直观的设计用户接口。
ClassWizard用来协助添加代码到框架文件,最后,通过类库实现了应用程序特定的逻辑。
MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的。
而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理。
框架或者由其本身处理事件,不依赖程序员的代码,或者调用程序员的代码来处理应用程序特定的事件。
1.S DI生成1.步骤dxq2009首先,打开VC++6.0开发环境,然后,选择”File”菜单中的“New”子菜单,在弹出的对话框中选择“MFC AppWizard(exe)”项并在“Progect name”编辑框中输入合适的工程名字Simple1,如图,它的意思是创建一个基于MFC的应用,接着进入正式的创建过程,MFC 应用程序的创建过程有6步(基于对话框)或者6步(SDI或者MDI),下面首先介绍SDI 应用的创建过程。
(1)第一步用于选择应用的结构以及语言等。
如图1,首先确定应用是否需要Doc/View Architecture Support支持,因为不使用该结构的应用不支持从磁盘文件打开文档,也没有派生于类CWnd的窗口客户区。
上面3个单选按钮用于确定创建的应用类型,包括单文档,多文档,对话框,这里选择第一个。
然后从资源列表框选择应用所使用的语言种类,单击“Next”。
图1(2)第二步为用用程序选择4项数据库支持选项之一:如图2.如果选择了数据库支持,那么单击“Data Source”按钮,选择外部的数据库表项,一般按默认即可,单击“Next”。
图2(3)第三步选择希望包含在应用中的复合文档支持项,同时判定是否启用标准的ActiveX 资源,以及是否为应用的菜单条添加额外的自动化命令等,如图4,一般安默认,单击“Next”图4(4)第四步用于选择应用所需的基本用户接口特征,以及所想使用的工具栏类型,如图5,如果想要修改应用所使用的文件名和扩展名,或者想要调整应用的用户接口和框架风格,就单击“Advanced”,然后修改,一般默认,单击“Next”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文档类1 文档类相关对数据的管理CDocument-父类是CCmdTarget类,提供文档数据的管理2 文档类的使用2.1 创建过程2.1.1 调用CFrameWnd的LoadFrame函数,调用Create函数创建Frame窗口2.1.2 在Frame的OnCreate函数中,先动态创建视图对象,在根据对象动态的创建View(视图)窗口2.1.3 在View的OnCreate函数中,将View的地址保存到Document(文档)中,将Document的地址保存到View中例://文档类class CMyDocument:public CDocument{DECLARE_DYNCREATE(CMyDocument)//动态创建声明宏public:CMyDocument();CString m_strData;//保存文档中数据的成员};IMPLEMENT_DYNCREATE(CMyDocument,CDocument)//动态创建实现宏//视图类class CDocView:public CEditView{DECLARE_DYNCREATE(CDocView)//动态创建声明宏public:virtual void OnInitialUpdate();//CView中的OnInitialUpdate()虚函数};IMPLEMENT_DYNCREATE(CDocView,CEditView)//动态创建实现宏// OnInitialUpdate()虚函数的重写(为了在视图中显示文档中数据)【1】void CDocView::OnInitialUpdate(){//获取文档的指针C MyDocument *pDc=(CMyDocument*)GetDocument();//根据文档指针显示文档中定义好的数据S etWindowText(pDc->m_strData);}//应用程序类class CMainApp:public CWinApp{public:virtual BOOL InitInstance();};//主窗体类class CMainFrame:public CFrameWnd{public:};CMainApp theApp;BOOL CMainApp::InitInstance(){CMainFrame *pFrame=new CMainFrame();CCreateContext context;//定义一个结构体保存构成窗口的视图,文档等信息【2】context.m_pCurrentDoc=new CMyDocument();//动态绑定文档类保存进结构context.m_pNewViewClass=RUNTIME_CLASS(CDocView);//动态绑定视图类保存进结构//调用CFrameWnd::Create函数创建主窗体,在创建消息处理函数中动态的创建了视图//在视图的创建消息处理函数中,将视图和文档的地址相互保存进对方pFrame->LoadFrame(IDR_MENU1,WS_OVERLAPPEDWINDOW,NULL,&context);//让框架通知文档视图更新(视图根据文档中数据更新)pFrame->InitialUpdateFrame(NULL,TRUE);m_pMainWnd=pFrame;m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateData();return TRUE;}相关:【1】OnInitialUpdate视图窗口完全建立后第一个被框架调用的函数。
框架在第一次调用OnDraw前会调用OnInitialUpdate,因此OnInitialUpdate是设置滚动视图的逻辑尺寸和映射模式的最合的地方。
时间上,两者先后顺序不同,构造函数生成本类的对象,但没有产生窗口,OnCreate 后窗口产生,然后才是视图的OnInitialUpDate,一般在这里对视图的显示做初始化。
简单点,就是ONCREATE只是产生VIEW的基本结构和变量而在OnInitialUpDate()中,主要初始化视图中控件等。
对各个变量进行初始化操作。
【2】CCreateContext在主程序创建框架窗口、以及文档相关的视图时,会使用CCreateContext结构。
建立窗口时,此结构中的值用于连接构成文档的组件和文档数据的视图。
仅当覆盖了创建过程时才需要使用CCreateContext。
CCreateContext结构包含了指向文档、框架窗口和文档模板的指针,包括了一个CRuntimeClass指针,CRuntimeClass标志了待创建的视图的类型。
运行时类信息和当前文档指针用于动态地创建视图。
下表列出了CCreateContext的每个成员的用法:m_pNewViewClass:待创建的视图的CRuntimeClassm_pCurrentDoc:将在其上创建视图的文档m_pNewDocTemplate:待创建的新MDI框架窗口的文档模板m_pLastView:待创建视图所依据的原始视图,例如在创建分裂窗口的视图或文档的第二个框架窗口时m_pCurrentFrame:待创建框架窗口所依据的框架窗口,例如在文档上创建第二个框架窗口时2.2 创建的这些类是如何相关联的(都有一个变量保存相关联的那个的地址)CWinApp|->m_pMainWnd(CFrameWnd)|->m_pViewActive(CView)|->m_pDocument(CDocument)|->m_viewList(Ciew的LIst)一个文档数据可以用多个视图来创建,一个视图只能显示一个文档那个数据2.3 命令消息的响应顺序View->Document->Frame->App自己定义的类也可以响应命令消息,只需要继承字CCmdTarget而且响应的优先级也可以自定,只需要将系统那几个主要的类中的虚消息响应函数重写即可★例:自己定义的类的命令消息响应优先级高于文档类//自己定义的类class CMyData:public CCmdTarget{DECLARE_MESSAGE_MAP()//消息响应声明宏public:afx_msg void OnTest();//消息处理函数};BEGIN_MESSAGE_MAP(CMyData,CCmdTarget)//消息响应实现宏ON_COMMAND(ID_TEST,OnTest)END_MESSAGE_MAP()//自定义类中对消息处理的函数void CMyData::OnTest(){AfxMessageBox("CMyData::OnTest");【3】}//文档类class CMyDocument:public CDocument{DECLARE_MESSAGE_MAP()public:CMyDocument();afx_msg void OnTest();//文档类的消息响应函数声明virtual BOOL OnCmdMsg( UINT nID,int nCode, void* pExtra,AFX_CMDHANDLERINFO* pHandlerInfo );public:CMyData m_data;//自定义类的对象CString m_strData;};//文档类的构造函数实现CMyDocument::CMyDocument(){m_strData="Hello Doc";}BEGIN_MESSAGE_MAP(CMyDocument,CDocument)ON_COMMAND(ID_TEST,OnTest)END_MESSAGE_MAP()//文档类的消息响应函数重写(定义自定义类消息响应优先级高于文档类)BOOL CMyDocument::OnCmdMsg(UINT nID, int nCode,void* pExtra,AFX_CMDHANDLERINFO* pHandlerInfo){if (m_data.OnCmdMsg(nID,nCode,pExtra,pHandlerInfo)){return TRUE;}return CDocument::OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);}//文档类对消息处理的函数void CMyDocument::OnTest(){AfxMessageBox("CMyDocument::OnTest");【3】}//视图类class CDocView:public CEditView{DECLARE_DYNCREA TE(CDocView)DECLARE_MESSAGE_MAP()public:virtual void OnInitialUpdate( );afx_msg void OnTest();};IMPLEMENT_DYNCREATE(CDocView,CEditView)BEGIN_MESSAGE_MAP(CDocView,CEditView)//ON_COMMAND(ID_TEST,OnTest)END_MESSAGE_MAP()//视图类消息处理函数void CDocView::OnTest(){MessageBox("CDocView");【3】}窗口类本身调用MessageBox就行文档类等就得调用AfxMessageBox……★2.4 View显示来自Document的数据【1】OnInitialUpdate()->在View被创建后,首次关联文档后,显示前调用单文档视图程序1 单文档视图程序只能管理一个文档2 相关类2.1 CWinApp/CFrameWnd/Cview/CDocument2.2 文档模板类CDocTemplate(抽象基类)父类是CCmdTarget两个子类:CSingleDocTemplate-单文档模板CMultiDocTemplate-多文档模板3 单文档CSingleDocTemplateCSingleDocTemplate类定义了一个文档模板用于实现单文档界面(SDI)。
一个SDI应用程序使用主框架窗口来显示一个文档;一次只能打开一个文档。
★一个文档模板定义了类的三个类型之间的关系:★1 一个从CDocument派生而来的文档类。
★2 一个视图类,用来显示来自上面提到的文档类的数据。
你可以从CView,CScrollView,CFormView,或CEditView派生这个类。