`
runfeel
  • 浏览: 904280 次
文章分类
社区版块
存档分类
最新评论

文档与串行化

 
阅读更多

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 TableIDR_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>

<wbr></wbr>

*****CGraph类支持串行化的操作*****

注:参考MSDNCObject::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结构,将一个应用程序所需要的“数据处理与显示”的函数空壳都设计好了,这些函数都是虚函数,我们可以在派生类中重写这些函数。有关文件读写的操作在CDocumentSerialize函数中进行,有关数据和图形显示的操作在CViewOnDraw函数中进行。我们在其派生类中,只需要去关注SerializeOnDraw函数就可以了,其它的细节我们不需要去理会,程序就可以良好地运行。

当我们按下“File/Open”,Application Framework会激活文件打开对话框,让你指定文件名,然后自动调用CGraphicDoc::Serialize读取文件。Application Framework还会调用CGraphicView::OnDraw,传递一个显示DC,让你重新绘制窗口内容。

MFC给我们提供Document/View结构,是希望我们将精力放在数据结构的设计和数据显示的操作上,而不要把时间和精力花费在对象与对象之间、模块与模块之间的通信上。

一个文档对象可以和多个视类对象相关联,而一个视类对象只能和一个文档对象相关联。

分享到:
评论

相关推荐

    《VC++深入详解》第13章 文档与串行化

    如何利用CDocument类的串行化存储功能保存与加载数据。如何实现类对串行化的支持,CObject的串行化实现内幕。删除文档数据时常犯的错误。MFC框架程序的文档类和视类的关系,以及如何获得相互的指针引用。

    MFC文档的串行化与保存

    MFC 文档串行化 保存

    VC 文件串行化示例.rar

    VC 文件串行化示例,源代码下载,涉及到的知识点:C语言对文件读写的支持,FILE指针;文本文件和二进制文件的区别。用文本方式读写文件和以二进制方式读写文件的注意事项。C 对文件读写的支持,ofstream和ifstream的...

    MFC 文档串行化

    在MFC中用Serialize函数实现读取文档中的数据,同时用Serialize函数实现文档中的数据的存储

    基于对话框工程的串行化-可用于保存配置

    VS2010工程 我们能都知道单文档多文档串行化非常简单,因为框架已经为我们生成好了. 但是单文档串行化这方面,资料还真是少.

    文档与串行化:VC++文件操作示例

    内容索引:VC/C++源码,文件操作,文件操作 const char *与char * const的区别。C语言对文件读写的支持,FILE指针;文本文件和二进制文件的区别。用文本方式读写文件和以二进制方式读写文件的注意事项。C++对文件读写...

    tsdf.zip_tsdf_串行化

    串行化是微软提供的用于对对象进行文件I/O的一种机制,该机制在框架(Frame)/文档(Document)/视图(View) 模式中得到了很好的应用。很多人对什么是串行化、怎么使对象具有串行化能力和如何使用串行化功能等问题都 不甚...

    MFC的文件串行化操作

    在MFC中使用文档类提供的串行化类进行文件的写入以及读取,保存图形的一些特征(比如起点和终点、画笔和画刷的类型)并进行图形的重绘。

    孙鑫C++教程(全20讲)PPT讲义源码及电子书

    第十三课:文档与串行化 第十四课:网络相关知识 第十五课:多线程与聊天室程序的创建 第十六课:线程同步与异步套接字编程 第十七课:进程间通信 第十八课:ActiveX控件 第十九课:动态链接库 第二十课:HOOK和数据库访问 ...

    Visual C++通用范例开发金典(分卷二/共三卷)

    全书按照Visual C++的实际应用共分为11章,主要内容包括:用户界面设计、文档应用程序设计、图形程序设计、文件I/O与串行化程序设计、多媒体程序设计、系统控制与注册表、数据库技术程序设计、网络、通信技术程序...

    Visual C++通用范例开发金典(第三卷/共三卷)

    全书按照Visual C++的实际应用共分为11章,主要内容包括:用户界面设计、文档应用程序设计、图形程序设计、文件I/O与串行化程序设计、多媒体程序设计、系统控制与注册表、数据库技术程序设计、网络、通信技术程序...

    Visual C++通用范例开发金典(第一卷、共两卷)

    全书按照Visual C++的实际应用共分为11章,主要内容包括:用户界面设计、文档应用程序设计、图形程序设计、文件I/O与串行化程序设计、多媒体程序设计、系统控制与注册表、数据库技术程序设计、网络、通信技术程序...

    串行化(Serialization)示范例子

    串行化是微软提供的用于对对象进行文件I/O的一种机制,该机制在框架(Frame)/文档(Document)/视图(View) 模式中得到了很好的应用。很多人对什么是串行化、怎么使对象具有串行化能力和如何使用串行化功能等问题都 不甚...

    Visual.C#2010从入门到精通

    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中的Serialization串行化范例代码

    内容索引:VC/C++源码,图形处理,串行化 VC中的Serialization串行化范例代码,串行化是微软提供的用于对对象进行文件I/O的一种机制,在框架(Frame)/文档(Document)/视图(View) 模式中得到了很好的应用。但是目前有...

    【doc】实时数据库的准一致性可串行化并发控制.doc

    【doc】实时数据库的准一致性可串行化并发控制

    USB2.0 —— 通用串行总线规范,通用串行总线(USB)

    本文档定义了行业标准USB。该规范描述了总线属性协议定义、事务类型、总线管理和所需的编程接口设计和构建符合本标准的系统和外围设备。 其目标是使来自不同供应商的此类设备能够在开放式体系结构中进行互操作。 该...

    吕鑫:《VC++就业培训宝典之MFC视频教程》第十三章 第三节 串行化存储原理分析

    1、演示CDocument类对比其他存储方法的优势,并深入解析串行化存储的原理。 (即CObject::Serialize回调函数的原理) 2、将CDocument类溶入视图与框架程序中,逐步将程序架构向文档模板架构模型靠近。

    VC++可视化编程指南

     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基于Matlab APP设计工具创建的串行示波器源码+GUI界面+详细文档+全部资料(高分项目).zip 【备注】 1、该项目是个人高分...

Global site tag (gtag.js) - Google Analytics