首页 > 代码库 > VC++环境下多文档模板应用程序开发(带源码)

VC++环境下多文档模板应用程序开发(带源码)

 我们以前见到的关于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