在Visual C++中如何建立多模板文档
2008-11-14 19:34:47 来源:WEB开发网我们知道,在一般的MDI应用程序中,只有一个文档模板,程序只能打开一种类型的文档。因此,只要调用File/New或者File/Open创建或者打开文档即可,至于文档、视和框架窗口之间的关系,则由文档模板在幕后控制,不须要对文档模板进行操作。
但是,如果应用程序需要处理多种类型的文档,并且何时打开何种文档均需手工控制的话,此时,就必须对文档模板进行编程。
例如,我们需要处理FIRST和SECOND两种文件类型。其中FIRST和SECOND的数据存放格式不同,就不能用相同的数据结构来描述,因此,把它们的数据都存入一个文档是不合适的,若FIRST和SECOND的视也是不同的(比如一个是图像而另一个是声音),因此,要解决这个问题只能分别建立两套文档模板,两套框架窗口,两套文档和两套视,分别用于存放和显示FIRST和SECOND 的数据。并且程序可以根据文件名来分别处理FIRST和SECOND 类型的文件。其主要步骤如下:
(1)在应用程序类(CWinApp)的派生类的InitInstance()函数中修改相应部分,增加程序所处理的文档模板,如下所示:
CMultiDocTemplate* pFirstDocTemplate;
pFirstDocTemplate = new CMultiDocTemplate(
IDR_FIRSTTYPE,
RUNTIME_CLASS(CFirstDoc), //指定第一种类型文件的文档类
RUNTIME_CLASS(CFirstFrame), //指定第一种类型文件的子框架
RUNTIME_CLASS(CFirstView)); //指定第一种类型文件的视
AddDocTemplate(pFirstDocTemplate); //为第一种类型的文档添加模板
CMultiDocTemplate* pSecondDocTemplate;
pSecondDocTemplate = new CMultiDocTemplate(
IDR_SECONDTYPE,
RUNTIME_CLASS(CSecondDDoc), //指定第二种类型文件的文档类
RUNTIME_CLASS(CSecondFrame), //指定第二种类型文件的子框架
RUNTIME_CLASS(CSecondView)); //指定第二种类型文件的视
AddDocTemplate(pSecondDocTemplate); //为第二种类型的文档添加模板
(2)在应用程序中增加菜单响应:
void CWinApp::OnFileOpen()
这里把文件名的后缀作为分支条件,如果是First类文件,则先获得关于First类文件的文档模板,然后调用CDocTemplate::OpenDocumentFile (lpszFileName)函数打开此文档。此函数将依次生成新文档,新框架,并在框架中创建视,最后向框架中所有的视发送初始化消息,使其显示在屏幕上。如果是Second类文件,操作类似。
{
POSITION P = GetFirstDocTemplatePosition();
CFileDialog Dlg(true);
if(Dlg.DoModal()= =IDOK)
{
CString FileName = Dlg.GetPathName();
CString FileExt = Dlg.GetFileExt();
if((FileExt=="First")||(FileExt=="first")||(FileExt=="FIRST"))
{
while(P!=NULL)
{
CDocTemplate* curTemplate=GetNextDocTemplate(P);
CString str;
curTemplate->GetDocString(str,CDocTemplate::docName);
if(str= =_T("First"))
{
curTemplate->OpenDocumentFile(FileName);
return;
}
}
}
else if((FileExt = = "Second") || (FileExt = = "second")||(FileExt= =SECOND"))
{
while(P!=NULL)
{
CDocTemplate* curTemplate=GetNextDocTemplate(P);
CString str;
curTemplate->GetDocString(str,CDocTemplate::docName);
if(str==_T("Second"))
{
curTemplate->OpenDocumentFile(FileName);
return;
}
}
}else
{
// may not be supported
AfxMessageBox("你所选的文件类型本程序不支持!");
return;
}
}
}
当然,我们还可以在程序的任何位置实现此操作:通过全局函数AfxGetApp 获得应用程序对象指针,从而获得相应的文档模板指针。
更多精彩
赞助商链接