1.CArchive写入和读取文件
void CGraphicView::OnFileWrite()
{
// TODO: Add your command handler code here
CFile file("1.txt",CFile::modeCreate | CFile::modeWrite);
CArchive ar(&file,CArchive::store);
int i=4;
char ch='a';
float f=1.3f;
CString str("http://www.sunxin.org");
ar<<i<<ch<<f<<str;
}
<wbr></wbr>
void CGraphicView::OnFileRead()
{
// TODO: Add your command handler code here
CFile file("1.txt",CFile::modeRead);
CArchive ar(&file,CArchive::load);
int i;
char ch;
float f;
CString str;
CString strResult;
ar>>i>>ch>>f>>str;
strResult.Format("%d,%c,%f,%s",i,ch,f,str);
MessageBox(strResult);
}
2.OnNewDocument函数
BOOL CGraphicDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
<wbr></wbr>
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
// SetTitle("http://www.sunxin.org");
return TRUE;
}
<wbr></wbr>
//IDR_MAINFRAME字符串资源。CGraphicApp->InitInstance->
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CGraphicDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CGraphicView));
AddDocTemplate(pDocTemplate);
<wbr></wbr>
使用GetDocString函数获取IDR_MAINFRAME字符串资源的各个字串。
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
String Table中IDR_MAINFRAME字符串资源中各子串的含义:
(1)CDocTemplate::windowTitle,主窗口标题栏上的字符串,MDI程序不需要指定,将以IDR_MAINFRAME字符串为默认值。
(2)CDocTemplate::docName,缺省文档的名称。如果没有指定,缺省文档的名称是无标题。
(3)CDocTemplate::fileNewName,文档类型的名称。如果应用程序支持多种类型的文档,此字符串将显示在"File/New"对话框中。如果没有指定,就不能够在"File/New"对话框处理这种文件。
(4)CDocTemplate::filterName,文档类型的描述和一个适用于此类型的通配符过滤器。这个字符串将出现在“File/Open”对话框中的文件类型列表框中。要和CDocTemplate::filterExt一起使用。
(5)CDocTemplate::filterExt,文档的扩展名。如果没有指定,就不能够在“File/Open”对话框中处理这种文档。要和CDocTemplate::filterName一起使用。
(6)CDocTemplate::regFileTypeId,如果你以::RegisterShellFileTypes向系统的注册表注册文件类型,此值会出现在HEY_CLASSES_ROOT之下成为其子项,并仅供Windows内部使用。如果没有指定,这种文件类型就无法注册。
(7)CDocTemplate::regFileTypeName,这也是存储在注册表中的文件类型名称。它会显示于程序中用以访问注册表的对话框内。
<wbr></wbr>
CGraphicDoc::OnNewDocument函数被调用的内部运行过程。该函数在点击“新建”命令时被调用。
<wbr></wbr>
3.CGraphicDoc::Serialize函数
Serialize函数是用来保存和加载数据的函数。
void CGraphicDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
int i=5;
char ch='b';
float f=1.2f;
CString str("http://www.sunxin.org");
ar<<i<<ch<<f<<str;
}
else
{
// TODO: add loading code here
int i;
char ch;
float f;
CString str;
CString strResult;
ar>>i>>ch>>f>>str;
strResult.Format("%d,%c,%f,%s",i,ch,f,str);
AfxMessageBox(strResult);
}
<wbr></wbr>
*****让CGraph类支持串行化的操作*****
注:参考MSDN,CObject::Serialize->Serialization(Object persistence)->Serialization:Making a Serializable Class->…
① Deriving your class from CObject (or from some class derived from CObject).
将前面章节中的Graph类的头文件和源文件导入工程,让它继承CObject类:class CGraph:public CObject。
② Overriding the Serialize member function.
在Graph头文件中声明Serialize函数:
void Serialize(CArchive& ar);
在Graph源文件中实现Serialize函数:
void CGraph::Serialize(CArchive& ar)
{
if(ar.IsStoring())
{
ar<<m_nDrawType<<m_ptOrigin<<m_ptEnd;
}
else
{
ar>>m_nDrawType>>m_ptOrigin>>m_ptEnd;
}
}
③ Using the DECLARE_SERIAL macro in the class declaration.
在Graph头文件中声明SERIAL宏:DECLARE_SERIAL(CGraph)。
④ Defining a constructor that takes no arguments.
⑤ Using the IMPLEMENT_SERIAL macro in the implementation file for your class.
在构造函数前面加上IMPLEMENT_SERIAL(CGraph, CObject, 1 )。
*****串行化完毕*****
在Graph类中增加图形绘制的函数:
void CGraph::Draw(CDC *pDC)
{
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *pOldBrush=pDC->SelectObject(pBrush);
switch(m_nDrawType)
{
case 1:
pDC->SetPixel(m_ptEnd,RGB(0,0,0));
break;
case 2:
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(m_ptEnd);
break;
case 3:
pDC->Rectangle(CRect(m_ptOrigin,m_ptEnd));
break;
case 4:
pDC->Ellipse(CRect(m_ptOrigin,m_ptEnd));
break;
}
pDC->SelectObject(pOldBrush);
}
<wbr></wbr>
如何拷贝一个资源:将菜单资源中的绘图菜单拷贝到我们的工程中。
。。。。。。
void CGraphicView::OnDot()
{
// TODO: Add your command handler code here
m_nDrawType=1;
}
<wbr></wbr>
void CGraphicView::OnLine()
{
// TODO: Add your command handler code here
m_nDrawType=2;
}
<wbr></wbr>
void CGraphicView::OnRectangle()
{
// TODO: Add your command handler code here
m_nDrawType=3;
}
<wbr></wbr>
void CGraphicView::OnEllipse()
{
// TODO: Add your command handler code here
m_nDrawType=4;
}
<wbr></wbr>
void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin=point;
CView::OnLButtonDown(nFlags, point);
}
<wbr></wbr>
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectObject(pBrush);
<wbr></wbr>
switch(m_nDrawType)
{
case 1:
dc.SetPixel(point,RGB(0,0,0));
break;
case 2:
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
break;
case 3:
dc.Rectangle(CRect(m_ptOrigin,point));
break;
case 4:
dc.Ellipse(CRect(m_ptOrigin,point));
break;
}
CGraph *pGraph=new CGraph(m_nDrawType,m_ptOrigin,point);
//m_obArray.Add(pGraph);
CGraphicDoc *pDoc=GetDocument();
pDoc->m_obArray.Add(pGraph);
<wbr></wbr>
CView::OnLButtonUp(nFlags, point);
}
<wbr></wbr>
void CGraphicDoc::Serialize(CArchive& ar)
{
POSITION pos=GetFirstViewPosition();
CGraphicView *pView=(CGraphicView*)GetNextView(pos);
if (ar.IsStoring())
{
// TODO: add storing code here
<wbr></wbr>
}
else
{
// TODO: add loading code here
<wbr></wbr>
}
// pView->m_obArray.Serialize(ar);
m_obArray.Serialize(ar);
}
<wbr></wbr>
void CGraphicView::OnDraw(CDC* pDC)
{
CGraphicDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int nCount;
//nCount=m_obArray.GetSize();
nCount=pDoc->m_obArray.GetSize();
for(int i=0;i
{
//((CGraph*)m_obArray.GetAt(i))->Draw(pDC);
((CGraph*)pDoc->m_obArray.GetAt(i))->Draw(pDC);
}
}
<wbr></wbr>
释放在堆上所分配的堆内存:
void CGraphicDoc::DeleteContents()
{
// TODO: Add your specialized code here and/or call the base class
int nCount;
nCount=m_obArray.GetSize();
<wbr></wbr>
while(nCount--)
{
delete m_obArray.GetAt(nCount);
m_obArray.RemoveAt(nCount);
}
CDocument::DeleteContents();
}
<wbr></wbr>
4. Document/View结构
在MFC中,文档类负责管理数据,提供保存和加载数据的功能。视类负责数据的显示,以及给用户提供对数据的编辑和修改功能。
MFC给我们提供Document/View结构,将一个应用程序所需要的“数据处理与显示”的函数空壳都设计好了,这些函数都是虚函数,我们可以在派生类中重写这些函数。有关文件读写的操作在CDocument的Serialize函数中进行,有关数据和图形显示的操作在CView的OnDraw函数中进行。我们在其派生类中,只需要去关注Serialize和OnDraw函数就可以了,其它的细节我们不需要去理会,程序就可以良好地运行。
当我们按下“File/Open”,Application Framework会激活文件打开对话框,让你指定文件名,然后自动调用CGraphicDoc::Serialize读取文件。Application
Framework还会调用CGraphicView::OnDraw,传递一个显示DC,让你重新绘制窗口内容。
MFC给我们提供Document/View结构,是希望我们将精力放在数据结构的设计和数据显示的操作上,而不要把时间和精力花费在对象与对象之间、模块与模块之间的通信上。
一个文档对象可以和多个视类对象相关联,而一个视类对象只能和一个文档对象相关联。
分享到:
相关推荐
如何利用CDocument类的串行化存储功能保存与加载数据。如何实现类对串行化的支持,CObject的串行化实现内幕。删除文档数据时常犯的错误。MFC框架程序的文档类和视类的关系,以及如何获得相互的指针引用。
MFC 文档串行化 保存
VC 文件串行化示例,源代码下载,涉及到的知识点:C语言对文件读写的支持,FILE指针;文本文件和二进制文件的区别。用文本方式读写文件和以二进制方式读写文件的注意事项。C 对文件读写的支持,ofstream和ifstream的...
在MFC中用Serialize函数实现读取文档中的数据,同时用Serialize函数实现文档中的数据的存储
VS2010工程 我们能都知道单文档多文档串行化非常简单,因为框架已经为我们生成好了. 但是单文档串行化这方面,资料还真是少.
内容索引:VC/C++源码,文件操作,文件操作 const char *与char * const的区别。C语言对文件读写的支持,FILE指针;文本文件和二进制文件的区别。用文本方式读写文件和以二进制方式读写文件的注意事项。C++对文件读写...
串行化是微软提供的用于对对象进行文件I/O的一种机制,该机制在框架(Frame)/文档(Document)/视图(View) 模式中得到了很好的应用。很多人对什么是串行化、怎么使对象具有串行化能力和如何使用串行化功能等问题都 不甚...
在MFC中使用文档类提供的串行化类进行文件的写入以及读取,保存图形的一些特征(比如起点和终点、画笔和画刷的类型)并进行图形的重绘。
第十三课:文档与串行化 第十四课:网络相关知识 第十五课:多线程与聊天室程序的创建 第十六课:线程同步与异步套接字编程 第十七课:进程间通信 第十八课:ActiveX控件 第十九课:动态链接库 第二十课:HOOK和数据库访问 ...
全书按照Visual C++的实际应用共分为11章,主要内容包括:用户界面设计、文档应用程序设计、图形程序设计、文件I/O与串行化程序设计、多媒体程序设计、系统控制与注册表、数据库技术程序设计、网络、通信技术程序...
全书按照Visual C++的实际应用共分为11章,主要内容包括:用户界面设计、文档应用程序设计、图形程序设计、文件I/O与串行化程序设计、多媒体程序设计、系统控制与注册表、数据库技术程序设计、网络、通信技术程序...
全书按照Visual C++的实际应用共分为11章,主要内容包括:用户界面设计、文档应用程序设计、图形程序设计、文件I/O与串行化程序设计、多媒体程序设计、系统控制与注册表、数据库技术程序设计、网络、通信技术程序...
串行化是微软提供的用于对对象进行文件I/O的一种机制,该机制在框架(Frame)/文档(Document)/视图(View) 模式中得到了很好的应用。很多人对什么是串行化、怎么使对象具有串行化能力和如何使用串行化功能等问题都 不甚...
13.6.2 文档串行化 278 13.6.3 类串行化 279 13.6.4 串行化实例 280 13.7 小结 284 第14章 进程和线程 285 14.1 进程和线程的基本概念 285 14.1.1 进程 285 14.1.2 线程 287 14.2 Win32的进程处理 287 14.2.1 进程的...
内容索引:VC/C++源码,图形处理,串行化 VC中的Serialization串行化范例代码,串行化是微软提供的用于对对象进行文件I/O的一种机制,在框架(Frame)/文档(Document)/视图(View) 模式中得到了很好的应用。但是目前有...
【doc】实时数据库的准一致性可串行化并发控制
本文档定义了行业标准USB。该规范描述了总线属性协议定义、事务类型、总线管理和所需的编程接口设计和构建符合本标准的系统和外围设备。 其目标是使来自不同供应商的此类设备能够在开放式体系结构中进行互操作。 该...
1、演示CDocument类对比其他存储方法的优势,并深入解析串行化存储的原理。 (即CObject::Serialize回调函数的原理) 2、将CDocument类溶入视图与框架程序中,逐步将程序架构向文档模板架构模型靠近。
7.5 不使用串行化的文档视结构程序 7.6 小 结 第八课 多文档界面MDI 8.1多文档界面窗口 8.2图形设备接口(GDI) 8.3 绘图程序 8.4访问当前活动视图和活动文档 8.5分隔视图 8.6打印和打印预览 ...
基于Matlab APP设计工具创建的串行示波器源码+GUI界面+详细文档+全部资料(高分项目).zip基于Matlab APP设计工具创建的串行示波器源码+GUI界面+详细文档+全部资料(高分项目).zip 【备注】 1、该项目是个人高分...