友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

深入浅出MFC第2版(PDF格式)-第147章

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





                           7 CDocTemplate::regFileTypeName 



                            6 CDocTemplate::regFileTypeId 



我必须再强调一次,AppWizard 早已帮我们产生出这些字符串。把这些来龙去脉弄清楚, 



只是为了知其所以然。当然,同时也为了万一你不喜欢AppWizard 准备的字符串内容,你 



知道如何去改变它。 



                                                                                   435 


…………………………………………………………Page 498……………………………………………………………

              第篇    湷觥 FC  程式設計 



          Scribble 的Document/View 设计 



               用最简单的一句话描述,Document 就是资料的体,View 就是资料的面。我们藉 



               CDocument 管理资料,藉Collections Classes (MFC  中的一组专门用来处理资料的类别) 



               处理实际的资料数据;我们藉CView 负责资料的显示,藉CDC 和CGdiObject 实际绘 



               图。人们常说一体两面一体两面,在MFC  中一体可以多面:同一份资料可以文字描述 



               之,可以长条图描述之,亦可以曲线图描述之。 



               Document/View 之间的关系可以图7…3 说明。View 就像一个观景器(我避免使用「窗口」 



               这个字眼,以免引起不必要的联想),使用者透过View 看到Document ,也透过View 改 



               变Document 。View 是Document  的外显接口,但它并不能完全独立,它必须依存在一个 



               所谓的Document Frame 窗口内。 



               一份Document 可以映射给许多个Views 显示,不同的Views 可以对映到同一份巨大 



               Document  的不同区域。总之,请把View 想象是一个镜头,可以观看大画布上的任何区 



               域(我们可以选用CScrollView 使之具备滚动条);在镜头上加特殊的偏光镜、柔光镜、十 



               字镜,我们就会看到不同的影像…虽然观察的对象完全相同。 



               资料的管理动作有哪些?读档和写档都是必要的,文件存取动作称为Serialization,由 



               Serialize  函数负责。我们可以(而且也应该)在CMyDoc 中改写Serialize  函数,使它符 



               合个人需求。资料格式的建立以及文件读写功能将在Scribble step1 中加入,本例(step0) 



               的CScribbleDoc 中并没有什么成员变量(也就是说容纳不了什么数据),Serialize 则简 



               直是个空函数: 



436 


…………………………………………………………Page 499……………………………………………………………

                                               第7章    簡單而完整:MFC 骨幹程式 



  void CScribbleDoc::Serialize(CArchive& ar) 

   { 

      if (ar。IsStoring()) 

      { 

              // TODO: add storing code here 

      } 

      else 

      { 

              // TODO: add loading code here 

      } 

   } 



这也是我老说骨干程序啥大事也没做的原因。 



除了文件读写,资料的显示也是必要的动作,资料的接受编辑也是必要的动作。两者都 



由View 负责。使用者对Document  的任何编辑动作都必须透过Document Frame 窗口, 



消息随后传到CView。我们来想想我们的View 应该改写哪些函数? 



 1。 当Document Frame 窗口收到WM_PAINT ,窗口内的View  的OnPaint 函数会被呼 



    叫,OnPaint 又调用OnDraw 。所以为了显示资料,我们必须改写OnDraw 。至于 



    OnPaint,主要是做「只输出到屏幕而不到打印机」的动作。有关打印机,我将 



    在第12 章提到。 



 2。 为了接受编辑动作,我们必须在View 类别中接受鼠标或键盘消息并处理之。 



    如果要接受鼠标左键,我们应该改写View 类别中的三个虚拟函数: 



  afx_msg void OnLButtonDown(UINT nFlags; CPoint point); 

  afx_msg void OnLButtonUp(UINT nFlags; CPoint point); 

  afx_msg void OnMouseMove(UINT nFlags; CPoint point); 



上述两个动作在Scribble step0 都看不到,因为它是个啥也没做的程序: 



  void CScribbleView::OnDraw(CDC* pDC) 

   { 

          CScribbleDoc* pDoc = GetDocument(); 

          ASSERT_VALID(pDoc); 



          // TODO: add draw code for native data here 

   } 



                                                                                  437 


…………………………………………………………Page 500……………………………………………………………

                    第篇    湷觥 FC  程式設計 



              主窗口的诞生 



                   上一章那个极为简单的Hello 程序,主窗口采用CFrameWnd 类别。本例是MDI 风格,将 



                   采用CMDIFrameWnd 类别。 



                   构造MDI 主窗口,有两个步骤。第一个步骤是new 一个CMDIFrameWnd 对象,第二个 



                   步骤是调用其LoadFrame  函数。此函数内容如下: 



                    // in WNDFRM。CPP 

                    BOOL CFrameWnd::LoadFrame(UINT nIDResource; DWORD dwDefaultStyle; 

                                                   CWnd* pParentWnd; CCreateContext* pContext) 

                    { 

                        CString strFullString; 

                        if (strFullString。LoadString (nIDResource)) 

                            AfxExtractSubString (m_strTitle; strFullString; 0);  // first sub…string 



                        if (!AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)) 

                            return FALSE; 



                        // attempt to create the window 

                        LPCTSTR lpszClass = GetIconWndClass (dwDefaultStyle; nIDResource); 

                        LPCTSTR lpszTitle = m_strTitle; 

                        if (!Create (lpszClass; lpszTitle; dwDefaultStyle; rectDefault; 

                                pParentWnd; MAKEINTRESOURCE(nIDResource); 0L; pContext)) 

                        { 

                                return FALSE;   // will self destruct on failure normally 

                        } 



                        // save the default menu handle 

                        m_hMenuDefault = ::GetMenu(m_hWnd); 



                        // load accelerator resource 

                        LoadAccelTable (MAKEINTRESOURCE(nIDResource)); 



                        if (pContext == NULL)   // send initial update 

                                SendMessageToDescendants(WM_INITIALUPDATE; 0; 0; TRUE; TRUE); 



                        return TRUE; 

                    } 



438 


…………………………………………………………Page 501……………………………………………………………

                                                      第7章    簡單而完整�
返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!