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

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

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






                       窗口, 负责显示资料。 



                                          给SDK 程序员 



                         你有以SDK 撰写MDI 程序的经验吗?MDI 程序有三层窗口架构: 



                            MDI Frame   在SDK 程序中,MDI Frame  窗口的消息预设处理 



                                        函数是DefFrameProc ,而不是DefWindowProc 。 



                                      MDI Frame窗口发出MDI 消息(如WM_MDICASCADE 、 

                                         _ 

                                       WM  MDITILE ),命令MDI Client 窗口管理其子窗口 



                                       (管理动作包括窗口产生、位置排列等等) 。 



                            MDI Client  MDI Client 是Windows 预设好的窗口类别,名为 



                                        〃MDIClient〃 。你也可以把它视为一种控制组件。 



                                            在SDK 程序中,MDI Child  窗口的消息预设处理函数 



                                            是DefMDIChildProc() ,而不是DefWindowProc() 。 



                MDI Child1  MDI Child2 MDI Child3 



652 


…………………………………………………………Page 715……………………………………………………………

                                              第 11 章    View 功能之加強與重繪效率之提昇 



        程序员想要控制MDI Child 窗口的大小、位置、排列状态,必须藉助另一个已经由 



        Windows 系统定义好的窗口, 此窗口称为MDI Client 窗口, 其类别名称为 



        〃MDICLIENT〃。 



        Frame 窗口、Client 窗口和Child 窗口构成MDI  的三层架构。Frame 窗口产生之后, 



        通常在WM_CREATE 时机就以CreateWindow(〃MDICLIENT 〃;。。。); 的方式建立Client 视 



        窗,此后几乎所有对Child 窗口的管理工作,诸如产生新的Child 窗口、重新排列窗口、 



        重新排列图标、在菜单上列出已开启窗口。。。等等,都由Client 代劳,只要Frame 窗口向 



        Client 窗口下命令(送MDI 消息如WM_MDICREATE 或WM_MDITILE 就去)即可。 



        你可以把CSplitterWnd 对象视为MDI Client ,观念上比较容易打通。 



分裂窗口之实作 



     让我先把Scribble  目前使用的类别之中凡与本节主题有关的,做个整理。 



     Visual C++ 4。0 以前的版本,AppWizard 为Scribble 产生的类别是这样子的: 



       用途             类别名称                        基础类别(MFC 类别) 



      main frame      CMainFrame                        CMDIFrameWnd 



      document frame   直接使用MFC 类别CMDIChildWnd               CMDIChildWnd 



      view            CScribbleView                     CView 



      document        CScribbleDoc                      CDocument 



      而其CMultiDocTemplate 对象是这样子的: 



      pDocTemplate = new CMultiDocTemplate( 

                             IDR_SCRIBTYPE; 

                             RUNTIME_CLASS(CScribbleDoc); 

                             RUNTIME_CLASS(CMDIChildWnd); 

                             RUNTIME_CLASS(CScribbleView)); 



       为了加上分裂窗口,我们必须利用ClassWizard 新增一个类别(在Scribble 程序中名为 



                                                                                      653 


…………………………………………………………Page 716……………………………………………………………

                    第篇    深入  MFC  程式設計 



                    CScribbleFrame),衍生自CMDIChildWnd,并让它拥有一个CSplitterWnd 对象,名为 



                    m_wndSplitter 。然后为CSrcibbleFrame 改写OnCreateClient 虚拟函数,在其中调用 



                    m_wndSplitter。Create  以产生分裂窗口、设定窗口个数、设定窗口的最初尺寸等初始状态。 



                    最后,当然,我们不能够再直接以CMDIChildWnd 负责document frame 窗口,而必须以 



                    CScribbleFrame 取代之。也就是说,得改变CMultiDocTemplate 构造式的第三个参数: 



                    pDocTemplate = new CMultiDocTemplate( 

                                           IDR_SCRIBTYPE; 

                                           RUNTIME_CLASS(CScribbleDoc); 

                                           RUNTIME_CLASS(CScribbleFrame); 

                                           RUNTIME_CLASS(CScribbleView)); 



                    俱往矣!Visual C++ 4。0 之后的AppWizard 为Scribble 产生的类别是这个样子: 



                    用途                       类别名称                   基础类别 



                    main frame                  CMainFrame                  CMDIFrame Wnd 



                    document frame              CChildFrame                 CMDIChild Wnd 



                    view                        CScribble View              CView 



                    document                    CScribbleDoc                CDocument 



                    而其CMultiDocTemplate 对象是这样子的: 



                    pDocTemplate = new CMultiDocTemplate( 

                                           IDR_SCRIBTYPE; 

                                           RUNTIME_CLASS(CScribbleDoc); 

                                           RUNTIME_CLASS(CChildFrame); 

                                           RUNTIME_CLASS(CScribbleView)); 



                    这就方便多了, CChildFrame 相当于以前( MFC 4。0 之前) 你得自力完成的 



                    CScribbleFrame。现在,我们可以从「为此类别新添成员变量」开始作为。 



654 


…………………………………………………………Page 717……………………………………………………………

                                     第 11 章    View 功能之加強與重繪效率之提昇 



  以下是加上分裂窗口的步骤: 



  在ClassView (注意,不是ClassWizard )中选择CChildFrame。按下右键,选 



  择突冒式菜单中的【Add Variable 】 



   出现【Add Member Variable 】对话框。填充如下,然后选按【OK 】。 



     现在你可以从ClassView 画面中实时看到CChildFrame 的新变量。 



  打开ChildFrm。cpp,在WizardBar  的【Messages 】清单中选择OnCreateClient。 



   以Yes  回答WizardBar  的询问,产生处理例程。 



  在函数空壳中键入以下内容: 



   return m_wndSplitter。Create(this; 2; 2; CSize(10; 10); pContext); 



                                                                           655 


…………………………………………………………Page 718……………………………………………………………

                  第篇    深入  MFC  程式設計 



                     回到ClassView 之中,你可以看到新的函数。 



                  CSplitterWnd::Create 正是产生分裂窗口的关键,它有七个参数: 



                    1。 表示父窗口。这里的this 代表的是CChildFrame 窗口。 



                    2。 分裂窗口的水平窗口数(row ) 



                    3。 分裂窗口的垂直窗口数(column ) 



                    4。 窗口的最小尺寸(应该是一个CSize 对象) 



                    5。 在窗口上使用哪一个View 类别。此参数直接取用Framework 交给 



                      OnCreateClient 的第二个参数即可。 



                    6。 指定分裂窗口的风格。默认值是: WS_CHILD|WS_ VISIBLE|WS_HSCROLL | 



                      WS_ VSCROLL|SPLS_DYNAMIC_SPLIT ,意思就是一个可见的子窗口,有着水平卷 



                      轴和垂直滚动条,并支持动态分裂。关于动态分裂(以及所谓的静态分裂),第 



                      13 章将另有说明。 



                    7。 分裂窗口的ID 。默认值是AFX_IDW_PANE_FIRST ,这将成为第一个窗口的ID 。 



                      我们的源代码有了下列变化: 



                  // in CHILDFRM。H 

                  class CChildFrame : public CMDIChildWnd 

                   { 

                  protected: 

                      CSplitterWnd    m_wndSplitter; 

                  protected: 

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

                   。。。 

                   }; 



                  // 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 



656 


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