友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

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

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!



…………………………………………………………Page 774……………………………………………………………

                     第篇    深入  MFC  程式設計 



                             m_wndSplitter2。CreateView(1; 0; RUNTIME_CLASS(CCurveView); 

                                 CSize(0; 0); pContext); 



                             return TRUE; 

                     } 



                    这会产生如下的分裂窗口: 



                                          1  m_wndSplitter1。CreateStatic(this; 1; 2) 

                                              产生静态分裂窗口,横列为1 纵行为2 。 



                                       m_wndSplitter1。CreateView(0; 0;  ;CSize(300;0)。。。)  

                                    2 产生第一个窗口(标号0;0) 



                                          m_wndSplitter2。CreateStatic(&m_wndSplitter1; 2; 1;       3 

                                                                                          m_wndSplitter1。IdFromRowCol(0; 1)。。。) 

                                           产生静态分裂窗口,横列为2  纵行为1。位在第一个分裂窗口的(0;1)窗口 



                                       m_wndSplitter2。CreateView(0; 0;  ;CSize(0;150)。。。)  

                                                                               4 

                                       产生第二个分裂窗口的第一个窗口(标号0;0) 



                                                             m_wndSplitter2。CreateView(1; 0;  ;CSize(0;0)。。。)  

                                                                                                    5 

                                                             产生第二个分裂窗口的第二个窗口(标号1;0) 



                                                                            窗口 (0;1) 

                   Splitter    窗口 (0;0)                       窗口 (0;0) 



                   窗口 

                                                                       150 

                初 始 高度 



                                                                      剩余高度 

                                                                              窗口 (1;0) 



                                         300                          剩余宽度 

                                                   Splitter 窗口初始宽度 



                       第二个分裂窗口的ID 起始值可由第一个分裂窗口的窗口之一获知(利用IdFromRowCol 



                       成员函数),一如上述程序代码中的动作。 



                       剩下的问题,就是如何设计许多个View 类别了。 



712 


…………………………………………………………Page 775……………………………………………………………

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



Graph  范例程序 



    Graph 是一个具备静态三叉分裂能力的程序。左侧窗口以文字方式显示10 笔整数资料, 



    右上侧窗口显示该10 笔数据的长条图,右下侧窗口显示对应的曲线图。 



    进行至这一章,相信各位对于工具的基本操作技术都已经都熟练了,这里我只列出Graph 



    程序的制作大纲: 



      进入AppWizard ,制造一个Graph 项目。采用预设的选项,但在第四步骤的 



      【Advanced 】对话框的【Windows Styles 】附页中,将【Use split window 】致能 



      (enabled )起来。并填写【Documents Template Strings 】附页如下: 



    最后,AppWizard 给我们这样一份清单: 



                                                                      713 


…………………………………………………………Page 776……………………………………………………………

                   第篇    深入  MFC  程式設計 



                    我们获得的主要类别整理如下: 



                      类别              基础类别                文件 



                      CGraphApp         CWinApp             GRAPH。CPP          GRAPH。H 



                      CMainFrame        CMDIFrame Wnd       MAINFRM。CPP      MAINFRM。H 



                      CChildFrame       CMDIChild Wnd       CHILDFRM。CPP    CHILDFRM。H 



                      CGraphDoc         CDocument           GRAPHDOC。CPP    GRAPHDOC。H 



                      CGraphView        CView               GRAPHVIEW。CPP    GRAPHVIEW。H 



                     进入整合环境的Resource View 窗口中, 选择IDR_GRAPHTYPE 菜单, 在 



                     【Window 】之前加入一个【Graph Data】菜单,并添加三个项目,分别是: 



714 


…………………………………………………………Page 777……………………………………………………………

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



    菜单项目名称                识别码(ID )                  提示字符串 



   Graph Data&1               ID_GRAPH_DATA1            〃Graph Data 1〃 



   Graph Data&2               ID_GRAPH_DATA2            〃Graph Data 2〃 



   Graph Data&3               ID_GRAPH_DATA3            〃Graph Data 3〃 



于是GRAPH。RC  的菜单资源改变如下: 



   IDR_GRAPHTYPE MENU PRELOAD DISCARDABLE 

   BEGIN 

       。。。 

       POPUP 〃&Graph Data〃 

       BEGIN 

           MENUITEM 〃Data&1〃;     ID_GRAPH_DATA1 

           MENUITEM 〃Data&2〃;     ID_GRAPH_DATA2 

           MENUITEM 〃Data&3〃;     ID_GRAPH_DATA3 

       END 

       。。。 

   END 



 

    回到整合环境的Resource View 窗口,选择IDR_MAINFRAME 工具栏,增加三 



 个按钮,放在Help 按钮之后,并使用工具箱上的Draws Text 功能,为三个 



 按钮分别涂上1; 2; 3 画面: 



这三个按钮的IDs 采用先前新增的三个菜单项目的IDs 



 于是,GRAPH。RC  的工具栏资源改变如下: 



   IDR_MAINFRAME TOOLBAR DISCARDABLE  16; 15 

                   。 

   BEGIN 

       。。。 

       BUTTON      ID_FILE_PRINT 

       BUTTON      ID_APP_ABOUT 

       BUTTON      ID_GRAPH_DATA1 

       BUTTON      ID_GRAPH_DATA2 

       BUTTON      ID_GRAPH_DATA3 

   END 



                                                                                     715 


…………………………………………………………Page 778……………………………………………………………

                     第篇    深入  MFC  程式設計 



                       进入ClassWizard,为新增的这些UI 对象制作Message Map 。由于这些命令 



                       项会影响到我们的Document  内容(当使用者按下Data1 ,我们必须为他准备 



                       一份相关资料;按下Data2 ,我们必须再为他准备一份相关资料),所以在 



                        CGraphDoc 中处理这些命令消息甚为合适: 



                        UI 对象                     Messages                                          消息处理例程 



                        ID_GRAPH_DATA1                MAND                          OnGraphData1 



                                                      UPDA TE_MAND_ UI              On Updat eGraphData1  



                        ID_GRAPH_DATA2                MAND                          OnGraphData2 



                                                      UPDA TE_MAND_ UI              On Updat eGraphData2  



                        ID_GRAPH_DATA3                MAND                          OnGraphData3 



                                                      UPDA TE_MAND_ UI              On Updat eGraphData3 



                     源代码改变如下: 



                         // in GRAPHDOC。H 

                         class CGraphDoc : public CDocument 

                         { 

                         。。。 

                         // Generated message map functions 

                         protected: 

                                //{{AFX_MSG(CGraphDoc) 

                                afx_msg void OnGraphData1(); 

                                afx_msg void OnGraphData2(); 

                                afx_msg void OnGraphData3(); 

                                afx_msg void OnUpdateGraphData1(CCmdUI* pCmdUI); 

                                afx_msg void OnUpdateGraphData2(CCmdUI* pCmdUI); 

                                afx_msg void OnUpdateGraphData3(CCmdUI* pCmdUI); 

                                //}}AFX_MSG 

                                DECLARE_MESSAGE_MAP() 

                         }; 



                         // in GRAPHDOC。CPP 

                         BEGIN_MESSAGE_MAP(CGraphDoc; CDocument) 

                                //{{AFX_MSG_MAP(CGraphDoc) 

                                ON_MAND(ID_GRAPH_DATA1; OnGraphData1) 

                                ON_MAND(ID_GRAPH_DATA2; OnGraphData2) 

                                ON_MAND(ID_GRAPH_DATA3; OnGraphData3) 

                                ON_UPDATE_MAND_UI(ID_GRAPH_DATA1; OnUpdateGraphData1) 



716 


…………………………………………………………Page 779……………………………………………………………

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



           ON_UPDATE_MAND_UI(ID_GRAPH_DATA2; OnUpdateGraphData2) 

           ON_UPDATE_MAND_UI(ID_GRAPH_DATA3; OnUpdateGraphData3) 

           //}}AFX_MSG_MAP 

   END_MESSAGE_MAP() 



 利用ClassWizard 产生两个新类别, 做为三叉分裂窗口中的另两个窗口的 

     

   View 类别: 



  类别名称        基础类别                  文件 



   CText View         CView                 TEXTVIEW。CPP    TEXTVIEW。H 



   CBar View          CView                 BARVIEW。CPP      BARVIEW。H 



     



 改写CChildFrame::OnCreateClient 函数如下(这是本节的技术重点): 



    #include 〃stdafx。h〃 

    #include 〃Graph。h〃 



    #include 〃ChildFrm。h〃 

    #include 〃TextView。h〃 

    #include 〃BarView。h〃 

    。。。 

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

           CCreateContext* pContext) 

    { 

           //产生静态分裂窗口,横列为1,纵行为2。 

           m_wndSplitter1。CreateStatic(this; 1; 2); 



           //产生分裂窗口的第一个窗口(标号0;0)的view 窗口,采用CTextView。 

           m_wndSplitter1。CreateView(0; 0; RUNTIME_CLASS(CTextView); 

                   CSize(300; 0); pContext); 



           // 产生第二个分裂窗口,横列为2 纵行为1。位在第一个分裂窗口的(0;1)窗口 

           m_wndSplitter2。CreateStatic(&m_wndSplitter1; 2; 1; 

                   WS_CHILD | WS_VISIBLE; m_wndSplitter1。IdFromRowCol(0; 1)); 



           //产生第二个分裂窗口的第一个窗口(标号0;0)的view 窗口,采用CBarView。 



           m_wndSplitter2。CreateView(0; 0; RUNTIME_CLASS(CBarView); 

                                          CSize(0; 150); pContext); 



           //产生第二个分裂窗口的第二个窗口(标号1;0)的view 窗口,采用CGraphView。 

           m_wndSplitter2。CreateView(1; 0; pContext…》m_pNewViewClass; 



                                          CSize(0; 0); pContext); 



                                                                                              717 


…………………………………………………………Page 780……………………………………………………………

                 第篇    深入  MFC  程式設計 



                            // 设定active pane 

                            SetActiveView((CView*)m_wndSplitter1。GetPane(0;0)); 

                            return TRUE; 

                    } 



                    为什么最后一次CreateView 时我以pContext …》m_pNewViewClass 取代 



                    RUNTIME_CLASS(CGraphView) 呢? 后者当然也可以, 但却因此必须包含 



               
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!