![]() |
#2
非池中物2013-03-08 11:27
|
首先本人在VS2008中建立的MDI工程为ExpMdi,由于文档模版DocTemplate是由应用程序管理的,则系统自动在CExpMdiApp类的InitInstance()添加了如下代码:

CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_ExpMdiTYPE,
RUNTIME_CLASS(CExpMdiDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CExpMdiView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);//添加一个由pDocTemplate指向的文档模版
其中CMultiDocTemplate函数的IDR_ExpMidTYPE既是文档类型,后面的RUNTIME_CLASS里的三个类分别是与该文档类型关联的文档、视图和框架类。由于我要读取的是Text和Bmp文件,而且为了与Windows的text和bmp相区别,将自己的text和bmp文档类型扩展名分别命名为mtext和mbmp,将文档类型分别命名为IDR_MTEXTTYPE和IDR_MBMPTYPE。由于这些类型名都是由资源文件管理的,添加的时候应在资源里天下。操作是打开资源文件的字符串表STRING TABLE,可以在串表里看到这样一行:pDocTemplate = new CMultiDocTemplate(IDR_ExpMdiTYPE,
RUNTIME_CLASS(CExpMdiDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CExpMdiView));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);//添加一个由pDocTemplate指向的文档模版
IDR_ExpMdiTYPE 129 \nExpMdi\nExpMdi\nExpMdi Files (*.em)\n.em\nExpMdi.Document\nExpMdi.Document
这就是系统自动添加的IDR_ExpMdiTYPE文档类型的一些设置。现在手动添加我们自定义的IDR_MTEXTTYPE和IDR_MBMPTYPE文档类型设置。IDR_MTEXTTYPE 101 \nMTEXT\nMTEXT\nExpMdi Files (*.mtxt)\n.mtxt\nMTEXT\nMTEXT Document
IDR_MBMPTYPE 102 \nMBMP\nMBMP\nExpMdi Files (*.mbmp)\n.mbmp\nMBMP\nMBMP Document
现在回到CExpMdiApp类的InitInstance函数中将IDR_ExpMdiTYPE改成我们自己的IDR_MTEXTTYPE。IDR_MBMPTYPE 102 \nMBMP\nMBMP\nExpMdi Files (*.mbmp)\n.mbmp\nMBMP\nMBMP Document
然后给CExpMdiDoc类添加一个CString类型的成员变量用于存放从文件中读取的数据,取名为m_Text。在CExpMdiDoc的构造函数中初始化m_Text:

CExpMdiDoc::CExpMdiDoc()
: m_Text(_T("这是一个多文档视图架构程序!"))
{
// TODO: 在此添加一次性构造代码
}
在CExpMdiDoc类的Serialize函数中添加如下代码:: m_Text(_T("这是一个多文档视图架构程序!"))
{
// TODO: 在此添加一次性构造代码
}

void CExpMdiDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
}
else
{
// TODO: 在此添加加载代码
ar.ReadString(m_Text);
}
}
由于CExpMdiView是负责数据的显示的,所以重写OnDraw()函数如下:{
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
}
else
{
// TODO: 在此添加加载代码
ar.ReadString(m_Text);
}
}

void CExpMdiView::OnDraw(CDC* pDC)
{
CExpMdiDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
pDC->TextOut(0,0,pDoc->m_Text);
}
添加以上代码后,运行程序,应该可以进行mtext文件操作了。如下图:{
CExpMdiDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
pDC->TextOut(0,0,pDoc->m_Text);
}
只有本站会员才能查看附件,请 登录