学习笔记---MFC文件 MFC对话框1
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创建对话框的基本步骤创建MFC对话框的步骤如下:1. 新建MFC项目。
在创建项目时,选择visual c++选项卡,然后选择MFC。
在右侧选择MFC应用程序,并在下方填写项目名称。
2. 选择应用程序类型。
在创建项目的过程中,你需要选择应用程序类型。
你可以选择单文档或基于对话框的应用程序类型。
以基于对话框的应用程序为例。
3. 添加对话框。
右键点击“Resource Files”,然后选择“Add Resource”。
在弹出的对话框中,选择“Dialog”,然后点击“New”。
这将在资源视图中创建一个新的对话框。
4. 给新的对话框重写ID。
右键点击新创建的对话框,选择“属性”,在属性页中修改IDD为所需的ID,例如IDD_EXEC。
5. 为模态对话框添加类。
右键点击选中的对话框,然后选择“添加类”。
在弹出的对话框中,输入类的名称,然后点击“确定”。
这将为对话框创建一个新的类。
6. 添加控件。
在对话框编辑器中,你可以直接从工具箱里拖动控件到对话框上。
例如,你可以拖动按钮控件到对话框上。
7. 添加事件处理程序。
对于每个添加的控件,你都可以为其添加事件处理程序。
你可以通过右键点击控件,然后选择“添加事件处理程序”来添加事件处理程序。
在弹出的对话框中,选择相应的事件(例如单击事件),然后在右侧的代码编辑器中编写事件处理程序。
8. 运行对话框。
在完成对话框的编辑后,你可以运行对话框来测试其功能。
你可以通过点击工具栏上的“启动”按钮或按F5键来启动应用程序。
这些步骤可以帮助你创建一个基本的MFC对话框。
当然,具体的实现方式还需要根据你的需求进行调整和修改。
MFC学习笔记-窗口创建

MFChierarchy chart(类库列表)MFC与Win321 win32:函数,使用API一步一步搭建应用程序。
(常使用FileView操作)2 MFC编程:实现仍然调用API函数,但是是用类封装API函数,使用向导自动生成应用程序框架。
(常使用ClassView操作)2.1需要掌握的技能2.1.1断点调试2.1.2堆栈调用的查看MFC课程内容1 MFC:MFC的六大机制,文档式架构,常用的MFC类,(10--12)。
2 COM(组件对象模型):COM的原理和应用(6)。
3 ADO/Socket:MFC访问数据库以及一些简单的网络编程。
MFC应用程序编程1 MFC的历史:92(VC1)98(VC6)……………………….2 MFC库基础:2.1 MFC库,微软基础类库。
封装了Windows应用程序编程的各种API以及相关机制的C++类库3 类库的相关头文件件★afx-application framework(应用程序框架x)3.1<stdafx.h>-不是类库头文件,是项目的头文件,称为VC下编译的预编译头文件,用来提高编译速度的。
(*.pch)(头文件是不参加编译的但是他参与生成*.pch)3.2<afxwin.h>-几乎包含了各种常用的MFC有文件3.3 <afxext.h>-提供扩展窗口类的支持(创建工具栏,状态栏等………)MFC应用程序的类型1 支持MFC的控制台应用程序(控制台的第四个选项)1.1 多了一个CWinApp(应用程序类,封装类应用程序启动过沉重所涉及到得相关信息)的全局对象(必须有,而且只能有一个)1.2主函数中多了一个AfxWinInit函数,初始化MFC库中的相关信息2 MFC库程序2.1 MFC支持的静态库2.2 MFC支持的动态库2.2.1 MFC规则库(shared MFC DLL)-可以被各种应用程序调用(非MFC程序,没有MFC类也可以调用)★还是有一个CWinApp派生的CMFC_DLLApp类对象2.2.2 MFC扩展库(using shared MFC DLL)-只能被MFC库所编写的应用程序所调用(对原有的MFC类扩展)★DllMain主函数只能被MFC程序调用3 MFC应用程序-----(注意看父类,子类名字可能不一样)3.1单文档视图应用程序★CWinApp 应用程序类★CAboutDlg(对话框-生成关于窗口-和框架没有任何关系)★CMainFrame(父类是:CFrameWnd)(应用程序主框架窗口类-生成应用程序的主框架-负责各个对象的协调工作)★CDocument(它是父类)(文档类-看不到的很重要-管理数据)★CView(它是父类)(视图类-显示数据并和用户进行交互)★CSingleDocApp(父类是CWinApp)-(使用前面的3个类来创建对象)3.2多文档视图架构★CWinApp 应用程序类★CAboutDlg(对话框-生成关于窗口-和框架没有任何关系)★CView(它是父类)(视图类-显示数据并和用户进行交互)★CDocument(它是父类)(文档类-看不到的很重要-管理数据)★CMDIChildWnd(子框架窗口类,父类)★CMDIFrameWnd(主框架窗口类,父类)我们看到的子窗体其实是★CView和★CMDIChildWnd叠加的3.3基于对话框的应用程序★CWinApp 应用程序类★CDialog(对话框窗口类)★★m_pMainWnd保存主窗口地址DoModal 显示对话框MFC相关类的说明1继承自CObject1.1 CObject类:绝大多数MFC类的父类,提供了MFC库的一些机制1 new/delete操作符,定义了与构造函数相关的内存分配函数2 assert和dump调试,堆调试的支持★3 运行时类信息-属于哪个类,还有类的层次结构★4 动态创建★5 序列化1.2 CWinThread: 线程类。
mfc 知识点总结

mfc 知识点总结MFC库的基本组成包括以下几个部分:1. CObject类:是所有MFC类的基类,提供了对象的基本功能,包括内存管理、类型信息、对象的打印和序列化等。
2. CWnd类:是窗口类的基类,封装了Windows窗口的创建、显示、消息处理等功能。
3. CFrameWnd类:是框架窗口类,派生自CWnd类,封装了应用程序的主窗口,提供了菜单、工具栏、状态栏等UI组件。
4. CDocument类和CView类:分别是文档类和视图类,用于管理应用程序中的文档和视图。
文档类负责文档的打开、保存、关闭等操作,视图类负责文档内容的显示和交互。
5. CWinApp类:是应用程序类的基类,封装了应用程序的初始化、消息循环、资源管理等功能。
MFC库提供了丰富的类和函数,用于处理Windows应用程序的各个方面,下面将对MFC的一些重要知识点进行总结。
1. 消息处理在MFC应用程序中,窗口的消息处理是至关重要的。
MFC提供了消息映射机制来进行消息处理。
通过DECLARE_MESSAGE_MAP宏和BEGIN_MESSAGE_MAP/END_MESSAGE_MAP 宏,在类中声明消息处理函数并将消息与处理函数进行映射。
例如:```cpp// 声明消息处理函数afx_msg void OnMouseMove(UINT nFlags, CPoint point);// 映射消息到处理函数BEGIN_MESSAGE_MAP(CMyWnd, CWnd)ON_WM_MOUSEMOVE()END_MESSAGE_MAP()```2. 对话框对话框是Windows应用程序中常用的界面元素,用于与用户进行交互。
MFC提供了CDialog类和CDialogEx类来封装对话框。
开发者可以使用资源编辑器创建对话框模板,然后通过类向导生成对话框类。
对话框类中可以处理控件的事件,并通过DoModal函数或Create函数来显示对话框。
关于MFC的有些知识

关于MFC的有些知识实验⼀1、在VC++中,⼯程与各种源⽂件之间是什么关系?解答:⼯程的实质是⼀些相互关联的源⽂件的集合,可以把项⽬理解成⼀个⼯作任务, 开发环境中,⼯程包含在⼯作区间中,⼀个⼯作区可以管理多个⼯程2、⼀个VC++⼯程下会有3个⽂件夹,这3个⽂件夹分别是什么?以.cpp为后缀的⽂件会添加到哪个⽂件夹中?以.h为后缀⽂件会添加到哪个⽂件夹中?解答:分别是head Files ,Sourse Files, Resourse Files ,.cpp放在Sourse ⽂件⾥⾯,.h放在Head Files⽂件⾥3,以win32 console application⼯程为例,简述⼯程的建⽴,⽂件的添加,⼯程的编译和链接及⼯程的执⾏过程。
解答:这个就是win32 console application⼯程的实例验证过程。
实验⼆1.简述Windows应⽤程序的特点。
解答:⼀.事件驱动的程序设计它是⼀种“被动”式程序设计⽅法,程序开始运⾏时,处于等待⽤户输⼊事件状态,然后取得事件并作出相应反应,处理完毕⼜返回并处于等待事件状态。
⼆. 消息循环与输⼊消息是⼀种报告有关事件发⽣的通知。
· 事件驱动是靠消息循环机制来实现的。
· Windows应⽤程序的消息来源有以下四种:(1)输⼊消息(2)控制消息(3)系统消息(4)⽤户消息三. 图形输出Windows程序的所有输出都是图形,字符也被作为图形来处理。
· GDI提供两种基本服务:创建图形输出和存储图象。
· 绘图函数分为三类:⼀是⽂字输出;⼆是⽮量图形函数,⽤于画线、圆等⼏何图形;三是光栅(位图)图形函数,⽤于绘制位图。
四. ⽤户界⾯对象⽤户界⾯对象:窗⼝边框系统菜单框标题栏菜单栏⼯具条客户区垂直滚动条和⽔平滚动条状态栏图标光标插⼊符对话框控件消息框五.资源共享· 常见的资源包括:设备上下⽂,画刷,画笔,字体,对话框控制,对话框,图标,定时器,插⼊符号,通信端⼝,电话线等。
MFC之编写一个简单的登录对话框

编写一个简单的登录对话框大家好,我们利用MFC编写一个简单的登录对话框。
主窗体是单文档界面。
程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来。
1、开打VC++6.0。
点击文件,新建,点击工程中的MFC AppWizard(exe),在右边选择工程保存的位置,并且为工程取好名字。
2、点击确定后,选择单个文档,你可以一直点击下一步,直到完成,或者在这里直接点击完成即可,完成后界面如下。
3、点击工具栏中的“!”号试着编译运行一次,看是否有问题。
如果没有问题,我们继续。
点击左边的ResourceView,在Dialog上面鼠标右键单击弹出一弹出框,单击Insert Dialog。
4、在右边新增的对话框中,适当改变窗口大小,加入静态文本框和文本编辑框。
5、鼠标右键单击刚才加进去的第一个静态文本框控件,点击属性。
在弹出的标题中填写:输入用户名:。
然后回车、在对话框上的任何空白的地方右键单击,点击建立类向导。
然后弹出选择建立Create a new class,点击OK。
这是为这个对话框创建一个新的类。
在Name中,为该对话框类取个名字:CDlg_login。
下面的Base class以及Dialog ID不要随便改动。
然后点击OK。
这样新的类CDlg_login就与本对话框建立起了联系。
8、点击OK后,我们并没有退出建立类向导。
点击member variables。
9、左键双击IDC_EDIT_NAME(或者单击后,点击右边的add variables),为IDC_EDIT_NAME增加一个对应在类中的名字:m_login_name。
其他地方不要改动。
点击OK。
同样也对IDC_EDIT_PWD也取一个名字:m_login_pwd。
10、点击确定。
这样我们就建立好了登录对话框以及其对应的类CDlg_login。
我们在ClassView里面可以看到我们新加入类CDlg_login。
11、我们注意到右边的对话框的标题栏上依然还是Dialog,我们可以在对话框空白的地方单击右键,点击属性,在标题中输入:请登录。
mfc对话框基础要点

第五章对话框对话框是一种用户界面,它的主要功能是输出信息和接收用户的输入。
对话框与控件是密不可分的,在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互。
一个典型的对话框例子是选择了File-Open命令后弹出的文件对话框。
5.1对话框和控件的基本概念5.1.1对话框的基本概念对话框(Dialog)实际上是一个窗口。
在MFC中,对话框的功能被封装在了CDialog类中,CDialog类是CWnd类的派生类。
对话框分为模态对话框和非模态对话框两种。
大部分读者都会有这样的经历,当你通过File-Open命令打开一个文件对话框后,再用鼠标去选择菜单将只会发出嘟嘟声,这是因为文件对话框是一个模态对话框。
模态对话框垄断了用户的输入,当一个模态对话框打开时,用户只能与该对话框进行交互,而其它用户界面对象收不到输入信息。
我们平时所遇到的大部分对话框都是模态对话框。
非模态对话框的典型例子是Windows95提供的写字板程序中的搜索对话框,搜索对话框不垄断用户的输入,打开搜索对话框后,仍可与其它用户界面对象进行交互,用户可以一边搜索,一边修改文章,这样就大大方便了使用。
本节主要介绍模态对话框,在第四节将介绍非模态对话框。
从MFC编程的角度来看,一个对话框由两部分组成:1.对话框模板资源。
对话框模板用于指定对话框的控件及其分布,Windows根据对话框模板来创建并显示对话框。
2.对话框类。
对话框类用来实现对话框的功能,由于对话框行使的功能各不相同,因此一般需要从CDialog类派生一个新类,以完成特定的功能。
5.1.2控件的基本概念图5.1对话框中的控件控件(Control)是独立的小部件,在对话框与用户的交互过程中,控件担任着主要角色。
控件的种类较多,图5.1显示了对话框中的一些基本的控件。
MFC的控件类封装了控件的功能,表5.1介绍了一些常用的控件及其对应的控件类。
表5.1控件实际上都是窗口,所有的控件类都是CWnd类的派生类。
MFC简单的登录对话框

登录对话框我们利用MFC编写一个简单的登录对话框。
主窗体是单文档界面。
程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来。
1、开打VC++6.0。
点击文件,新建,点击工程中的MFC AppWizard(exe),在右边选择工程保存的位置,并且为工程取好名字。
2、点击确定后,选择单个文档,你可以一直点击下一步,直到完成,或者在这里直接点击完成即可,完成后界面如下。
3、点击工具栏中的“!”号试着编译运行一次,看是否有问题。
如果没有问题,我们继续。
点击左边的ResourceView,在Dialog上面鼠标右键单击弹出一弹出框,单击Insert Dialog。
4、在右边新增的对话框中,适当改变窗口大小,加入静态文本框和文本编辑框。
输入用户名:。
然后回车同样在下面的第二个静态文本框的属性标题改为:输入密码:。
然后回车。
6、在第一个文本编辑框上右键单击,点击属性,把ID框中的IDC_EDIT1改为容易理解的名字,如:IDC_EDIT_NAME,注意前面的IDC_EDIT最好不要去掉,这样容易见名而知义。
同样,对第二个文本编辑框的属性中的IDC_EDIT2改为:IDC_EDIT_PWD7、在对话框上的任何空白的地方右键单击,点击建立类向导。
然后弹出选择建立Create a new class,点击OK。
这是为这个对话框创建一个新的类。
在Name中,为该对话框类取个名字:CDlg_login。
下面的Base class以及Dialog ID不要随便改动。
然后点击OK。
这样新的类CDlg_login就与本对话框建立起了联系。
8、点击OK后,我们并没有退出建立类向导。
点击member variables。
9、左键双击IDC_EDIT_NAME(或者单击后,点击右边的add variables),为IDC_EDIT_NAME增加一个对应在类中的名字:m_login_name。
其他地方不要改动。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MFC文件1 MFC文件相关CFile-父类是CObject,封装了文件操作的API,提供了创建,数据读写等操作。
CFileFind-文件查找2 CFile的使用2.1 打开或者创建文件的时候,注意设置打开模式。
(CFile::Open)【1】virtual BOOL Open(LPCTSTR lpszFileName, //文件的路径UINT nOpenFlags, //打开模式CFileException* pError = NULL);// 指向一个存在的文件异常对象,获取失败操作的状态。
返回值:成功打开,则返回非零值,否则为0。
pError参数仅在返回0时才有意义。
2.2 数据读写,注意读写才做的异常捕获。
【2】virtual void Write(const void* lpBuf//写入的数据或者缓冲区地址,UINT nCount//写入的数据字节数);virtual UINT Read (void* lpBuf,//接受文件中数据的缓冲区地址UINT nCount);//读取的字节。
返回值:传输到缓冲区的字节数2.3 文件的关闭【3】CFile::Close2.4 文件指针操作SeekToBegin/SeekToEnd【4】2.5 Flush-强制缓冲区的数据写入硬盘读写的时候,不会直接写到目的地,为了提高效率,引入缓冲区,缓冲区满了,再写入目的低。
当缓冲区还没有写满就结束时,调用Flush使缓冲区的数据刷新到目的地。
2.6 LockRange/UnLockRange当多个程序同时操作一个文件时,可以锁定指定位置和字节数量的文件区域,这个区域的数据其他程序是不能修改的,直到解锁解锁后才能区修改2.7 GetStatus/SetStatus【5】设置或获取文件状态信息//获取文件的状态信息(文件路径,放入的状态结构)static BOOL PASCAL GetStatus(LPCSTR lpszFileName, CFileStatus& rStatus);3 CFileFind文件查找3.1 FindFile 开始查找3.2 FindNextFile 查找下一个,依次遍历查找结果3.3 Close 关闭查找请求例:void MyFile(){CFile file;【1】BOOLbRet=file.Open("E:\\huai.txt",CFile::modeCreate|CFile::modeReadWrite);if(!bRet){return;}//项目时应在异常处理中执行操作【2】try{file.Write("helloworld",10);file.SeekToBegin();【4】CHAR szText[256]={0};file.Read(szText,256);printf("%s\n",szText);}catch (CException* ){//异常处理}file.Close();【3】}//获得或者设置文件的信息【5】void MyFileStatus(){CFileStatus status;CFile::GetStatus("E:\\huai.txt",status);//定义一个时间段CTimeSpan span(365,0,0,0);★status.m_mtime+=span;CFile::GetStatus("E:\\huai.txt",status);}void MyFileFind(CString strPath){CFileFind find;//判断当前文件下是否有文件BOOL bRet=find.FindFile(strPath+"*.*");while(bRet){//只有调用FindNextFile才能获取文件信息(执行它下面的才起作用)★bRet=find.FindNextFile();CString strName=find.GetFileName();strPath=find.GetFilePath();if(find.IsDirectory() && !find.IsDots()){printf("目录:%s\n",strName);//接着再查找MyFileFind(strPath+"\\*.*");}else{printf("文件:%s\n",strName);}}find.Close();}int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){// MyFile();// MyFileStatus();MyFileFind("C:\\");return 0;}文件序列化1序列化采用数据流的方式,将数据依次写入或者读取文件,是二进制的存储方式(.dat)。
2 序列化相关CFile 文件类CArchive 归档类,封装了序列化的具体操作CObject//完成数据读写virtual void Serialize( CArchive& ar );//判断某个对象是否支持序列化BOOL IsSerializable( ) const;3 序列化的使用3.1 新建或者打开文件CFile::Open(文件的路径,文件的打开方式)3.2 定义CArchive对象3.3 使用CArchive对象存储或者加载数据-----(注意存储和加载的数据的顺序要一致)CArchive ar(&file,CArchive::store);存储"<<"CArchive ar(&file,CArchive::load);读取">>"3.4 关闭CArchive对象CArchive::Close()3.5 关闭文件CFile::Close()CArchive::Close()4 CArchive类4.1 数据结构CArchive定义缓存,缓存的长度由m_nBufSize,减少读写硬盘的次数class CArchive{..........BOOL m_nMode;BOOL m_bUserBuf;//int m_nBufSize; //缓存的长度CFile* m_pFile; //关联文件的地址BYTE* m_lpBufCur; //当前指针位置BYTE* m_lpBufMax; //终止指针位置BYTE* m_lpBufStart; //起始指针位置...........};★4.2 执行过程数据存储、写入(内存-→缓冲区-→文件)4.2.1 判断在Buffer当中是否有足够的空间存储数据4.2.2 如果空间不够,将Buffer中已有的数据写入文件,重置m_lpBufCur为Buffer的起始位置4.2.3 将内存数据拷贝到m_lpBufCur的地址4.2.4 将m_lpBufCur向后偏移写入的字节数写到最后ar.Close(),自动调用Flush(),把缓冲区中剩余的数据写入文件★4.3 数据的读出(加载),(文件-→缓冲区-→内存)4.3.1 首先判断剩余的Buffer是否满足读取数据的大小4.3.2如果不满足,调用FillBuffer()函数,并将需要的字节数传入Cur+4>max||----------------------------AAA|4.3.2.1 将Buffer中没有使用的字节数拷贝到Buffer的起始位置Cur||AAA---------------------------|4.3.2.2 从文件中读取Buffer剩余空间长度的数据,这样前面的半个数据变完整了,再次循环Cur||AAAABBCDDDD-------------------|4.3.2.3 数据块读完了,不到Max的值,根据实际读出文件的数据长度设置Max的地址4.3.3 将数据从m_lpBufCur位置的Buffer中取出放到变量中4.3.4 将m_lpBufferCur向后偏移读出的字节数例:CWinApp theApp;using namespace std;//数据的写入void MyStore(){CFile file;BOOL bRe t=file.Open("C:\\huai.dat",CFile::modeReadWrite|CFile::modeCreate);if (!bRet){return;}CArchive ar(&file,CArchive::store);//写入文件(2进制保存)★ar<<100;double d=12.25;ar<<d;ar.Close();file.Close();}//数据的读取void MyLoad(){CFile file;BOOL bRet=file.Open("C:\\huai.dat",CFile::modeReadWrite);if (!bRet){return;}CArchive ar(&file,CArchive::load);//从文件到内存★int a=0;ar>>a;printf("%d\n",a);double d1=0.0;ar>>d1;printf("%f\n",d1);ar.Close();file.Close();}int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){MyStore();MyLoad();return 0;}5 对象的序列化序列化的基本思想是:一个类应该能够对自己的成员变量的数据进行读写操作,对象可以通过读操作而重新创建。
即对象可以将其当前状态(由其成员变量的值表示)写入永久性存储体(通常指磁盘)中,以后可以从永久性存储体中读取(载入)对象的状态,从而重建对象。
类的对象自己应该具备将状态值写入磁盘或从磁盘中读出的方法(即成员函数),这种对象的保存和恢复过程称为序列化。
★序列化对象- 将对象的类的信息,对象中的数据保存到文件★反序列化对象- 根据读取的类的信息,创建对象,然后将对象中的数据读入好处是,类对象可以改变改变(增加成员变量,成员函数),但是序列化的两个函数不用重写,只需把前面重载的函数重写5.1 使用5.1.1 定义支持序列化的类1 CObject 类的子类2 重写CObject类的Serialize函数3 在类定义中添加宏,DECLARE_SERIAL(类名称)4 在类的实现中增加宏,IMPLEMENT_SERIAL(类名称,父类名称,)5.1.2 打开或者新建文件5.1.3 定义CArchive对象5.1.4 将类的对象保存或者读取5.1.5 关闭CArchive对象5.1.6 关闭文件5.2 代码5.3 operator>>创建对象并读取数据_init_Student将类的运行时类信息保存到模块中的m_classList的链表中5.4 对象序列化(存入文件)5.4.1 获取对象的运行时类信息5.4.2 将类的版本和名称写入到CArchive对象(写入到该类CRuntimeClass结构中)5.4.3 调用对象的Serialize函数5.4.4 在函数中保存该对象自己的数据5.5 对象的反序列化(从文件读取,动态创建对象)5.5.1 从文件中读取类的名称5.5.2 根据类的名称,从m_classList链表中查询该类对应的运行时类信息地址5.5.3 使用查询到的运行时类信息创建对象5.5.4 调用对象的Serialize函数例:CWinApp theApp;using namespace std;//自定义类(序列化保存他)class Student:public CObject{public://★DECLARE_SERIAL(Student)//序列化基于动态创建★//宏展开_DECLARE_DYNCREATE(Student)AFX_API friend CArchive& AFXAPI operator>>(CArchive& ar, Student* &pOb);virtual void Serialize( CArchive& ar );CString m_strName;int m_nAge;Student(CString name="",int age=20):m_strName(name),m_nAge(age){};void Show();};//IMPLEMENT_SERIAL(Student,CObject,1)//宏展开CObject* PASCAL Student::CreateObject(){ return new Student; }//运行时类信息_IMPLEMENT_RUNTIMECLASS(Student, CObject, 1,Student::CreateObject)AFX_CLASSINIT _init_Student(RUNTIME_CLASS(Student));CArchive& AFXAPI operator>>(CArchive& ar, Student* &pOb){ pOb = (Student*) ar.ReadObject(RUNTIME_CLASS(Student));return ar; }void Student::Show(){printf("学生信息:name:%s age:%d\n",m_strName,m_nAge);}//重写CObject类的Serialize函数(相当于运算符重载)★void Student::Serialize( CArchive& ar ){if (ar.IsStoring())//确定是否正在存储归档文件。