WEB开发网
开发学院软件开发VC 在Visual C++中如何建立多模板文档 阅读

在Visual C++中如何建立多模板文档

 2008-11-14 19:34:47 来源:WEB开发网   
核心提示:我们知道,在一般的MDI应用程序中,在Visual C++中如何建立多模板文档,只有一个文档模板,程序只能打开一种类型的文档,当然,我们还可以在程序的任何位置实现此操作:通过全局函数AfxGetApp 获得应用程序对象指针,因此,只要调用File/New或者File/Open创建或者打开文档即可

我们知道,在一般的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()
{
  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;
  }
 }
}
  这里把文件名的后缀作为分支条件,如果是First类文件,则先获得关于First类文件的文档模板,然后调用CDocTemplate::OpenDocumentFile (lpszFileName)函数打开此文档。此函数将依次生成新文档,新框架,并在框架中创建视,最后向框架中所有的视发送初始化消息,使其显示在屏幕上。如果是Second类文件,操作类似。

当然,我们还可以在程序的任何位置实现此操作:通过全局函数AfxGetApp 获得应用程序对象指针,从而获得相应的文档模板指针。

Tags:Visual 如何 建立

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接