zoukankan      html  css  js  c++  java
  • 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程序界面 Bub Bub Bub文件(*.bub) .bub Bub.Document Bub Document

    相应的解释如下:

    为分隔符:

    以下的字符按照上面的顺序依次介绍,大家可以一一对应的看:
     Bub程序界面 :应用程序窗口标题(仅对单文档界面有效)
    Bub :文档类型
    Bub  :文档名称(出现在选择文件对话框中的)
    Bub文件(*.bub)  :文件名过滤器(出现在选择文件对话框中的)
    .bub  :文档扩展名
    Bub.Document  :存储在系统注册表中的文档类型标识符
    Bub 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

  • 相关阅读:
    用js实现双色球
    nodejs_理解Buffer
    nodejs_buffer.copy
    nodejs_buffer.concat
    nodejs_buffer.alloc
    Ant Design Pro v4 最新版安装(跳过所有坑)
    python eventlet详解
    python 超时重试方法
    pycharm配置react
    Python性能优化的20条建议
  • 原文地址:https://www.cnblogs.com/BBOOT/p/3776563.html
Copyright © 2011-2022 走看看