关于Document/View的MDI程序的一个问题
本人最近在写一个能读取和显示Text和Bmp两种格式文件的基于Docmuent/View架构的MDI程序,开发过程中遇到了一个小问题。首先将自己的分开发过程介绍一下,希望大家共同学习进步,然后说一下我在开发过程中遇到的问题,希望各位高手能给个解答,当然答案能令我满意的有高分奖励的。首先本人在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,可以在串表里看到这样一行: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。
然后给CExpMdiDoc类添加一个CString类型的成员变量用于存放从文件中读取的数据,取名为m_Text。在CExpMdiDoc的构造函数中初始化m_Text:
程序代码:CExpMdiDoc::CExpMdiDoc()
: m_Text(_T("这是一个多文档视图架构程序!"))
{
// TODO: 在此添加一次性构造代码
}
在CExpMdiDoc类的Serialize函数中添加如下代码:
程序代码:void CExpMdiDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
}
else
{
// TODO: 在此添加加载代码
ar.ReadString(m_Text);
}
}
由于CExpMdiView是负责数据的显示的,所以重写OnDraw()函数如下:
程序代码:void CExpMdiView::OnDraw(CDC* pDC)
{
CExpMdiDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
pDC->TextOut(0,0,pDoc->m_Text);
}添加以上代码后,运行程序,应该可以进行mtext文件操作了。如下图:






