八宝书库 > 文学其他电子书 > 深入浅出MFC第2版(PDF格式) >

第146部分

深入浅出MFC第2版(PDF格式)-第146部分

小说: 深入浅出MFC第2版(PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



                                                                                              733 


…………………………………………………………Page 796……………………………………………………………

                   第篇    深入  MFC  程式設計 



                       // in HEXVIEW。CPP 

                       BEGIN_MESSAGE_MAP(CHexView; CView) 

                               //{{AFX_MSG_MAP(CHexView) 

                                       // NOTE the ClassWizard will add and remove mapping macros here。 

                               //}}AFX_MSG_MAP 

                               // Standard printing mands 

                               ON_MAND(ID_FILE_PRINT; CView::OnFilePrint) 

                               ON_MAND(ID_FILE_PRINT_DIRECT; CView::OnFilePrint) 

                               ON_MAND(ID_FILE_PRINT_PREVIEW; CView::OnFilePrintPreview) 

                       END_MESSAGE_MAP() 



                       ///////////////////////////////////////////////////////////////////// 

                       // CTextView printing 



                       BOOL CHexView::OnPreparePrinting(CPrintInfo* pInfo) 

                       { 

                               // default preparation 

                               return DoPreparePrinting(pInfo); 

                       } 



                       void CHexView::OnBeginPrinting(CDC* /*pDC*/; CPrintInfo* /*pInfo*/) 

                       { 

                               // TODO: add extra initialization before printing 

                       } 



                       void CHexView::OnEndPrinting(CDC* /*pDC*/; CPrintInfo* /*pInfo*/) 

                       { 

                               // TODO: add cleanup after printing 

                       } 



                      本例并未示范Serialization 动作。 



             非制式作法的缺点 



                    既然是走后门,就难保哪一天出问题。如果MFC  的版本变动, 



                    CMDIFrameWnd::OnWindowNew  内容改了,你就得注意本节这个方法还能适用否。 



734 


…………………………………………………………Page 797……………………………………………………………

                                         第 13 章    多重文件與多重顯示 



下面是Text 程序的执行画面。我先开启一个Text 窗口,再选按【Window/New Hex 



Window 】或工具栏上的对应按钮,开启另一个Hex 窗口。两个View 窗口以不同的方 



式显示同一份文件资料。 



当你选按【File/Preview 】命令项,哪一个窗口为active 窗口,那个窗口的内容就出现在 



预视画面中。以下是Text 窗口的打印预视画面: 



                                                                 735 


…………………………………………………………Page 798……………………………………………………………

             第篇    深入  MFC  程式設計 



              以下是Hex 窗口的打印预视画面: 



         多重文件 



            截至目前,我所谈的都是如何以不同的方式在不同的窗口中显示同一份文件资料。如果 



            我想写那种「多功能」软件,必须支持许多种文件类型,该怎么办? 



            就以前一节的Graph 程序为基础,继续我们的探索。Graph  的文件类型原本是一个整数 



            数组,数量有10 笔。我想在上面再多支持一种功能:文字编辑能力。 



         新的  Document  类別 



            首先,我应该利用ClassWizard 新添一个Document 类别,并以CDocument 为基础。 



            激活ClassWizard,选择【Member Variables 】附页,按下【Add Class。。。 】钮,出现对话框, 



            填写如下: 



736 


…………………………………………………………Page 799……………………………………………………………

                                                   第 13 章    多重文件與多重顯示 



下面是  ClassWizard  为我们做出來的码: 



#0001  // NewDoc。cpp : implementation file 

#0002  // 

#0003 

#0004  #include 〃stdafx。h〃 

#0005  #include 〃Graph。h〃 

#0006  #include 〃NewDoc。h〃 

#0007 

#0008  #ifdef _DEBUG 

#0009  #define new DEBUG_NEW 

#0010  #undef THIS_FILE 

#0011  static char THIS_FILE'' = __FILE__; 

#0012  #endif 

#0013 

#0014  ///////////////////////////////////////////////////////////////// 

#0015  // CNewDoc 

#0016 



                                                                                737 


…………………………………………………………Page 800……………………………………………………………

                   第篇    深入  MFC  程式設計 



                    #0017  IMPLEMENT_DYNCREATE(CNewDoc; CDocument) 

                    #0018 

                    #0019  CNewDoc::CNewDoc() 

                    #0020  { 

                    #0021  } 

                    #0022 

                    #0023  BOOL CNewDoc::OnNewDocument() 

                    #0024  { 

                    #0025          if (!CDocument::OnNewDocument()) 

                    #0026                  return FALSE; 

                    #0027          return TRUE; 

                    #0028  } 

                    #0029 

                    #0030  CNewDoc::~CNewDoc() 

                    #0031  { 

                    #0032  } 

                    #0033 

                    #0034 

                    #0035  BEGIN_MESSAGE_MAP(CNewDoc; CDocument) 

                    #0036          //{{AFX_MSG_MAP(CNewDoc) 

                    #0037          // NOTE the ClassWizard will add and remove mapping macros here。 

                    #0038          //}}AFX_MSG_MAP 

                    #0039  END_MESSAGE_MAP() 

                    #0040 

                    #0041  ///////////////////////////////////////////////////////////////// 

                    #0042  // CNewDoc diagnostics 

                    #0043 

                    #0044  #ifdef _DEBUG 

                    #0045  void CNewDoc::AssertValid() const 

                    #0046  { 

                    #0047          CDocument::AssertValid(); 

                    #0048  } 

                    #0049 

                    #0050  void CNewDoc::Dump(CDumpContext& dc) const 

                    #0051  { 

                    #0052          CDocument::Dump(dc); 

                    #0053  } 

                    #0054  #endif //_DEBUG 

                    #0055 

                    #0056  ///////////////////////////////////////////////////////////////// 

                    #0057  // CNewDoc serialization 

                    #0058 

                    #0059  void CNewDoc::Serialize(CArchive& ar) 

                    #0060  { 

                    #0061          if (ar。IsStoring()) 

                    #0062          { 



738 


…………………………………………………………Page 801……………………………………………………………

                                                              第 13 章    多重文件與多重顯示 



       #0063                  // TODO: add storing code here 

       #0064          } 

       #0065          else 

       #0066          { 

       #0067                  // TODO: add loading code here 

       #0068          } 

       #0069 

       #0070          // CEditView contains an edit control which handles all serialization 

       #0071          ((CEditView*)m_viewList。GetHead())…》SerializeRaw(ar); 

       #0072  } 

       #0073 

       #0074  ////////////////////////////////////////////////////////////// 

       #0075  // CNewDoc mands 



       注:阴影中的这两行码(#0070 和#0071)不是ClassWizard 产生的,是我自己加的,提前与 



       你见面。稍后我会解释为什么加这两行。 



新的 Document Template 



       然后,我应该为此新的文件类型产生一个Document Template,并把它加到系统所维护的 



       DocTemplate  串行中。注意,为了享受现成的文字编辑能力,我选择CEditView 做为与 



       此Document 搭配之View 类别。还有,由于CChildFrame 已经因为第一个文件类型 



       Graph  的三叉静态分裂而被我们改写了OnCreateClient 函数,已不再适用于这第二个文 



       件类型(NewDoc ),所以我决定直接采用CMDIChildWnd 做为NewDoc 文件类型的MDI 



       Child Frame 窗口: 



       #include 〃stdafx。h〃 

       #include 〃Graph。h〃 

       #include 〃MainFrm。h〃 

       #include 〃ChildFrm。h〃 

       #include 〃GraphDoc。h〃 

       #include 〃GraphView。h〃 

       #include 〃NewDoc。h〃 

       。。。 

       BOOL CGraphApp::InitInstance() 

       { 

               。。。 

               CMultiDocTemplate* pDocTemplate; 

               pDocTemplate = new CMultiDocTemplate( 

                       IDR_GRAPHTYPE; 

                       RUNTIME_CLASS(CGraphDoc); 

                       RUNTIME_CLASS(CChildFrame); // custom MDI child frame 



                                                                                              739 


…………………………………………………………Page 802……………………………………………………………

                   第篇    深入  MFC  程式設計 



                                   RUNTIME_CLASS(CGraphView)); 

                           AddDocTemplate(pDocTemplate); 



                           pDocTemplate = new CMultiDocTemplate( 

                                   IDR_NEWTYPE; 

                                   RUNTIME_CLASS(CNewDoc); 

                                   RUNTIME_CLASS(CMDIChildWnd); // use directly 

                                   RUNTIME_CLASS(CEditView)); 

                           AddDocTemplate(pDocTemplate); 

                           。。。 

                    } 



                   CMultiDocTemplate 的第一个参数(resource ID )也不能再延用Graph 文件类型所使用的 



                   IDR_GRAPHTYPE 了。要知道,这个ID 值关系非常重大。我们得自行设计一套适用于 



                   NewDoc 文件类型的UI 系统出来(包括菜单、工具栏、文件存取对话框的内容、文件 



                    图标、窗口标题。。。)。 



                   怎么做?第7章的深入讨论将在此开花结果!请务必回头复习复习「Document Template 



                   的意义」一节,我将直接动作,不再多做说明。 



             新的 UI 系统 



                   下面就是为了这新的 NewDoc  文件型态所对应的  UI  系统,新添的文件內容 (没有什么 



                   好工具可以帮忙,一般文字编辑器的  copy/paste  最快): 



                   // in RESOURCE。H 

                   #define IDD_ABOUTBOX                    100 

                   #define IDR_MAINFRAME                   128 

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的