关于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文件操作了。如下图: