我们以前见到的关于VC++环境下利用APP Wizard 自动生成的MDI的应用程序只支持打开同一文档类型的多个文件,但是不能够同时打开不同种类型的文档。网上的这种公开资料比较少,我在知网上查阅了相关的资料。下面我根据这些资料做一下总结(辛辛苦苦一个一个字码出来的)。
下面设计一个能够处理两种文档类型的应用程序:第一种文档类型:TXT文档,第二种文档类型:Bub的文档类型。
第一种的文档类型TXT,是利用APP Wizard自动生成的,只不过是在设置的时候将文档类型设置为TXT类型,并且使生成的视图派生类继承与CEditView类。
第二种文档类型Bub,这个类型是在生成的MDI程序中添加的自定义文档类型(下面会有相应的介绍).
应用程序建立过程(最后会将相应的源码上传以供大家下载)注意下面的介绍是VC6.0为开发工具:
1.首先使用APP Wizard建立一个MDI程序,注意在建立的过程中需要在第4步的Advanced Options对话框中设置文件的扩展名为txt;在第6步中将视图类的基类设置为CEditView.编译完成后,该应用程序就可以对文本文件进行相应的编辑了。
2. 下面通过Insert/New Class 菜单选项为项目添加3个MFC派生类CBubDoc ,CBubView和CBubFrame类分别派生于CDocument ,CView和CMDIChildWnd.
为CBubDoc类添加两个数据成员:
CRect m_rectBubble[MAX_BUBLLE];
int m_nBubbleCount;
其中MAX_BUBLLE被定义为200;
使用Class Wizard 为CBubDoc类添加DeleteContents()函数,并为其添加代码:
m_nBubbleCount = 0;
修改CBubDoc类的Serialize()函数并使之可以存取泡泡图形数据。
if (ar.IsStoring())
{
ar<<m_nBubbleCount;
for (int i = 0;i<m_nBubbleCount;i++)
{
ar<<m_rectBubble[i];
}
}
else
{
ar>>m_nBubbleCount;
for (int i = 0;i<m_nBubbleCount;i++)
{
ar>>m_rectBubble[i];
}
}
在CBubView类头文件首部添加#include “BubDoc.h”并为CBubView类添加一个成员函数
public:
CBubDoc * GetDocument();
在类声明的结束处添加以下代码:
#ifndef _DEBUG
inline CBubDoc * CBubView::GetDocument()
{
return (CBubDoc *) m_pDocument;
}
#endif
在相应的类实现文件中添加以下代码:
CBubDoc * CBubView::GetDocument()
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBubDoc)));
return (CBubDoc *) m_pDocument;
}
修改CBubView类的OnDraw函数,使其可以显示泡泡图形。
代码如下:
void CBubView::OnDraw(CDC* pDC)
{
CBubDoc* pDoc = GetDocument();
pDC->SelectStockObject(LTGRAY_BRUSH);
for (int i =0;i<pDoc->m_nBubbleCount;i++)
{
pDC->Ellipse(pDoc->m_rectBubble[i]);
}
}
使用Class Wizard为CBubView类添加鼠标左键按下的消息处理函数,并编辑代码如下:
void CBubView::OnLButtonDown(UINT nFlags, CPoint point)
{
CBubDoc * pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (pDoc->m_nBubbleCount<MAX_BUBLLE)
{
int r = rand()%50 + 10;
pDoc->m_rectBubble[pDoc->m_nBubbleCount] =
CRect(point.x-r,point.y-r,point.x+r,point.y+r);
InvalidateRect(pDoc->m_rectBubble[pDoc->m_nBubbleCount]);
pDoc->m_nBubbleCount++;
}
CView::OnLButtonDown(nFlags, point);
}
3.为新文档类型定义资源标识符IDR_BUBTYPE,该标识符用于新文档类型的所有资源,包括字符串资源,子框架窗口菜单和图标。
4.在字符串资源中为新的文档类型添加新的字符串资源(标识符为IDR_BUBTYPE)
如下:
Bub程序界面\nBub\nBub\nBub文件(*.bub)\n.bub\nBub.Document\nBub Document
相应的解释如下:
\n 为分隔符:
以下的字符按照上面的顺序依次介绍,大家可以一一对应的看:
Bub程序界面 :应用程序窗口标题(仅对单文档界面有效)
\nBub :文档类型
\nBub :文档名称(出现在选择文件对话框中的)
\nBub文件(*.bub) :文件名过滤器(出现在选择文件对话框中的)
\n.bub :文档扩展名
\nBub.Document :存储在系统注册表中的文档类型标识符
\nBub Document :存储在系统注册表中的文档类型
5.编辑主框架窗口菜单资源。
在文件子菜单中添加新类型文档的新建和打开选项。这两个菜单选项的标识符设置为ID_FILE_NEW_BUB和ID_FILE_OPEN_BUB,并且将原来的新建菜单选项的标识符改为ID_FILE_NEW_TXT.
6.编辑主框架窗口的工具条资源。可以自行设置,不过标识符小一样哦。
7.利用Insert/Resource为新的文档类型的子框架窗口添加菜单资源(标识符为IDR_BUBTYPE)。
其中文件子菜单下的选项包括新建图形文档(ID_FILE_NEW_BUB),打开图形文档(ID_FILE_OPEN_BUB)和新建文本文档(ID_FILE_NEW_TXT),打开文本文档(ID_FILE_OPEN),关闭文档,保存文档,另存为和退出。
其他的未列出来的标识符按照主框架的菜单设置,剩余的其他的菜单项按照主框架的菜单设置。
8.为新建的文档类型添加图标资源(标识符IDR_BUBTYPE)
9.在应用程序派生类中找到相应的InitInstance()函数,添加以下代码设置新的文档模板;
CMultiDocTemplate* pBubTemplate;
pBubTemplate = new CMultiDocTemplate(
IDR_BUBTYPE,
RUNTIME_CLASS(CBubDoc),
RUNTIME_CLASS(CBubFrame),
RUNTIME_CLASS(CBubView));
AddDocTemplate(pBubTemplate);
并在调用ProcessShellCommand(cmdInfo)之前添加如下代码:
//主要是在应用程序的建立的时候不建立任何类型的文档。
cmdInfo.m_nShellCommand = CCommandLineInfo.FileNothing;
在应用程序的派生类的头部添加以下代码:
#include "BubDoc.h"
#include "BubFrame.h"
#include "BubView.h"
并使用Class Wizard 创建ID_FILE_NEW_BUB ,ID_FILE_OPEN_BUB和ID_FILE_NEW_TXT的消息响应函数。
响应函数的代码如下:
void CMultiDoctempApp::OnFileNewTxt()
{
POSITION curTemplatePos = GetFirstDocTemplatePosition();
while (curTemplatePos != NULL)
{
CDocTemplate * curTemplate = GetNextDocTemplate(curTemplatePos);
CString str;
curTemplate->GetDocString(str,CDocTemplate::docName);
if (str == _T("Txt"))
{
curTemplate->OpenDocumentFile(NULL);
return;
}
}
AfxMessageBox("NO TXTTEMPALTE!");
}
void CMultiDoctempApp::OnFileNewBub()
{
POSITION curTemplatePos = GetFirstDocTemplatePosition();
while (curTemplatePos != NULL)
{
CDocTemplate * curTemplate = GetNextDocTemplate(curTemplatePos);
CString str;
curTemplate->GetDocString(str,CDocTemplate::docName);
if (str == _T("Bub"))
{
curTemplate->OpenDocumentFile(NULL);
return;
}
}
AfxMessageBox("NO BUBTEMPALTE!");
}
void CMultiDoctempApp::OnFileOpenBub()
{
POSITION curTemplatePos = GetFirstDocTemplatePosition();
while (curTemplatePos != NULL)
{
CDocTemplate * curTemplate = GetNextDocTemplate(curTemplatePos);
CString str;
curTemplate->GetDocString(str,CDocTemplate::docName);
if (str == _T("Bub"))
{
CFileDialog dlg(true);
if (dlg.DoModal() == IDOK)
{
CString path = dlg.GetPathName();
curTemplate->OpenDocumentFile(path);
}
return;
}
}
AfxMessageBox("NO TXTTEMPALTE!");
}
以上的介绍就是VC++环境下多文档模板应用程序开发的一个小例子。希望能够帮助到大家。
该篇文章参考知网上的论文资料本人总结所得。
源码的下载地址:http://download.csdn.net/my