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

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

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






     MFC 所谓的Document 观念。此外,「MDI 风格」还包括程序必须有一个Window 选 



     单,提供对于小子窗口的管理,包括tile 、cascade、icon arrange 等命令项: 



                                                             701 


…………………………………………………………Page 764……………………………………………………………

               第篇    深入  MFC  程式設計 



                至于SDI 程序,就是一般的、没有上述风格的non…MDI 程序。 



                在MFC  的定义中,MDI 表示可「同时」开启一份以上的Documents ,这些Documents 



                可以是相同类型,也可以是不同类型。许多份Documents  同时存在,必然需要许多个子 



                窗口容纳之,每个子窗口其实是Document  的一个View 。即使你在MDI 程序中只开启 



                一份Document ,但以【Window/New Window 】的方式打开第二个view 、第三个view。。。 , 



                亦需占用多个子窗口。因此这和SDK 所定义的MDI 有异曲同工的意义。 



                至于SDI 程序,同一时间只能开启一份Document 。一份Document 只占用一个子窗口 



                 (亦即其View 窗口),因此这也与SDK 所定义的SDI 意义相同。当你要在SDI 程 



                式中开启第二份Document ,必须先把第一份Document 关闭。 



                MDI 程序未必一定得提供一个以上的Document 类型。所谓不同的Document 类型是指 



                程序提供不同的CDocument 衍生类别,亦即有不同的Document Template。软件工业早 



                期曾经流行一种「全效型」软件,既处理电子表格、又作文书处理、又能绘图作画!  K ,伟 



                大得不得了,这种软件就需要数种文件类型:电子表格、文书、图形!  K 。 



702 


…………………………………………………………Page 765……………………………………………………………

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



多重显像 (                           ) 

             Multiple Views 



       只要是具备MDI 性质的MFC 程序(也就是你曾在AppWizard 步骤一中选择【Multiple 



       Documents 】项目),天生就具备了「多重显像」能力。「天生」的意思是你不必动手, 



       application framework  已经内含了这项功能:随便执行任何一版的Scribble,你都可以在 



        【Window 】菜单中找到【New Window 】这个命令项,按下它,就可以获得「同源子视 



       窗」如图13…1。 



        我将以「多重显像」来称呼Multiple Views 。多重显像的意思是资料可以不同的类型显现 



         出来。并以「同源子窗口」代表「显示同一份Document 而又各自分离的View 窗口」。 



          图13…1  【Window/New Window】可以为 「目前作用中的View 所对应的 



                Document 再开一个View 窗口。 



                                                                       703 


…………………………………………………………Page 766……………………………………………………………

              第篇    深入  MFC  程式設計 



              另外,第11 章也介绍了一种变化,是利用分裂窗口的各个窗口,显示Document  内容。 



             这些窗口虽然集中在一个大窗口中,但它们的视野却可以各自独立,也就是说它们可以 



             看到Document  中的不同区域,如图13…2。 



                   图13…2 分裂窗口的不同窗口可以观察同一Document 资料的不同区域。 



              但是我们发现,不论是同源子窗口或分裂窗口的窗口,都是以相同的方式(也就是同一 



              个CMyView::OnDraw )表现Document  内容。如果我们希望表达力丰富一些,如何是好? 



              到现在为止我们并没有看到任何一个Scribble 版本具备了多种显像能力。 



        窗口的动态分裂 



              动态分裂窗口由CSplitterWnd 提供服务。这项技术已经在第11 章的Scribble Step4 示范 



              过了。它并没有多重显像的能力,因为每一个窗口所使用的View 类别完全相同。当第 



704 


…………………………………………………………Page 767……………………………………………………………

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



一个窗口形成(也就是分裂窗口初产生的时候),它将使用Document Template  中登记 



的View 类别,作为其View 类别。尔后当分裂发生,也就是当使用者拖拉滚动条之上名 



为分裂棒(splitter box)的横杆,导至新窗口诞生,程序就以「动态生成」的方式产生出 



新的View 窗口。 



 因此,View 类别一定必须支持动态生成,也就是必须使用DECLARE_DYNCREATE 和 



 IMPLEMENT_DYNCREATE 宏。请回顾第8章。 



AppWizard 支持动态分裂窗口。当你在AppWizard 步骤四的【Advanced 】对话框的 



 【Windows Styles 】附页中选按【Use split window 】选项: 



  你的程序比起一般未选【Use split window 】选项者有如下差异(阴影部份): 



                                                                      705 


…………………………………………………………Page 768……………………………………………………………

                   第篇    深入  MFC  程式設計 



                    // in CHILDFRM。H 

                   class CChildFrame : public CMDIChildWnd 

                    { 

                    。。。 

                   protected: 

                           CSplitterWnd m_wndSplitter; 



                   public: 

                    // Overrides 

                           // ClassWizard generated virtual function overrides 

                           //{{AFX_VIRTUAL(CChildFrame) 

                           public: 

                           virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs; CCreateContext* pContext); 

                           virtual BOOL PreCreateWindow(CREATESTRUCT& cs); 

                           //}}AFX_VIRTUAL 

                    。。。 

                    }; 



                    // in CHILDFRM。CPP 

                   BOOL CChildFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/; 

                           CCreateContext* pContext) 

                    { 

                           return m_wndSplitter。Create( this; 

                                   2; 2;              // TODO: adjust the number of rows; columns 

                                   CSize( 10; 10 );   // TODO: adjust the minimum pane size 

                                   pContext ); 

                    } 



                    ◆  CSplitterWnd::Create 的详细规格请回顾第11 章。 



                    这些其实也就是我们在第11 章为Scribble Step4 亲手加上的码。如果你一开始就打定主 



                    意要使用动态分裂窗口,如上便是了。 



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