1.2.6  多文档示例

本节演示了一个极为简单多文档程序。

1.实例说明

本示例是一个简单的文本编辑程序,可以同时编辑多个文本。功能有新建文本、打开文本,保存文本。

2.实现

具体代码如下:

1)新建一个多文档工程Ex010206,在应用程序向导的第6步,将视图类的基类改成CRichEditView。在完成时会弹出对话框询问是否支持OLE(如图1-54所示),单击“确定”按钮加入OLE支持。

1-54 是否支持OLE

2)利用类向导重载CEx010206NewDoc类的函数OnOpenDocument,代码如下:

BOOL CEx010206Doc::OnOpenDocument(LPCTSTR lpszPathName)

{

         if (!CRichEditDoc::OnOpenDocument(lpszPathName))

                   return FALSE;

        

         bool bRet = TRUE ;//记录返回值

         CRichEditView *pView = NULL ;

         char * pfileContent = NULL ;

         //读取文件内容

         CFile file ;

         try

         {

                   file.Open(lpszPathName,CFile::modeRead);

                   pfileContent = new char[file.GetLength() + 1 ] ;//动态数组

                   memset(pfileContent, 0 , file.GetLength() + 1 );

                   file.ReadHuge(pfileContent,file.GetLength());

                   file.Close();

         }

         catch(CFileException * e)

         {                

                   ASSERT(false);

                   e->m_cause ;

                   bRet = FALSE ;

                   goto end ;

         }

        

         pView = GetView();

         if(NULL == pView)

         {

                   bRet = FALSE ;

                   goto end ;

         }      

         {//不以在goto之后定义变量,所以只好加一个大括号

                   CRichEditCtrl& edit   = pView->GetRichEditCtrl();      

                   edit.SetWindowText(pfileContent);

                   //设置为未修改,避免关闭的时候弹出提示保存对话框

                   SetModifiedFlag(false);

                   goto end ;

         }

        

end:

         if(NULL != pfileContent)

         {

                   delete [] pfileContent ;

                   pfileContent = NULL ;

         }      

         return bRet;

}

3)利用类向导重载CEx010206NewDoc类的函数OnSaveDocument,代码如下:

BOOL CEx010206Doc::OnSaveDocument(LPCTSTR lpszPathName)

{

         //取得多功能编辑框的内容

         CString strText ;

         CRichEditView *pView = GetView();

         if(NULL == pView)

                   return false ;

         CRichEditCtrl &edit = pView->GetRichEditCtrl(); 

         edit.GetWindowText(strText);

        

         //将内容存进文件

         CFile file ;

         try

         {

                   file.Open(lpszPathName,CFile::modeCreate|CFile::modeWrite);

                   file.WriteHuge((LPCTSTR)strText,strText.GetLength());

                   file.Close();

         }

         catch(CFileException * e)

         {

                   ASSERT(false);

                   e->m_cause ;

                   return false ;

         }

        

         return CRichEditDoc::OnSaveDocument(lpszPathName);

}

4)按Ctrl + F5键创建并运行Ex010206.exe。随便输入一些内容,单击“保存”按钮。再单击“新建”按钮,再输入一些内容,再单击“保存”按钮。关闭程序,再依次打开两个文档,选择菜单“窗口→平铺”命令,效果如图1-55所示。

1-55  Ex010206.exe运行效果

3.已知问题

该示例的功能划分不当。通常文档类应该只处理数据,打开文档时应该只列新数据,而不处理显示。但因为这个问题与本节关系不大,所以暂不修改。

注意:重载了两个函数,完成了如下功能:

1)选择菜单“文件→打开”命令。

2)选择菜单“文件→保存”命令。

3)选择菜单“文件→另存为”命令。

4)选择菜单“文件→最近文件”命令。

5)使用命令行打开文件。

因为工具栏上的“打开”、“保存”按钮的菜单项的ID项相同,故不单独列出。



回目录