南 昌 外 围 - 南 昌 的 外 围 资 源

  南 昌 外 围 - 南 昌 的 外 围 资 源 -薇芯【81343628】【81343628】【高端外围资源】【诚信合作,非诚勿扰!】可直接添加 !我们以前见到的关于VC++环境下利用APP Wizard 自动生成的MDI的应用程序只支持打开同一文档类型的多个文件,但是不能够同时打开不同种类型的文档。网上的这种公开资料比较少,我在知网上查阅了相关的资料。下面我根据这些资料做一下总结(辛辛苦苦一个一个字码出来的)。
  下面设计一个能够处理两种文档类型的应用程序:第一种文档类型:TXT文档,第二种文档类型:Bub的文档类型。
  第一种的文档类型TXT,是利用APP Wizard自动生成的,只不过是在设置的时候将文档类型设置为TXT类型,并且使生成的视图派生类继承与CEditView类。
  第二种文档类型Bub,这个类型是在生成的MDI程序中添加的自定义文档类型(下面会有相应的介绍).
  南 昌 外 围 - 南 昌 的 外 围 资 源 -薇芯【81343628】【81343628】【高端外围资源】【诚信合作,非诚勿扰!】可直接添加 !应用程序建立过程(最后会将相应的源码上传以供大家下载)注意下面的介绍是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"
  南 昌 外 围 - 南 昌 的 外 围 资 源 -薇芯【81343628】【81343628】【高端外围资源】【诚信合作,非诚勿扰!】可直接添加 !并使用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);
  }

猜你喜欢

转载自www.cnblogs.com/wwyyff80/p/12784095.html