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

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

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




                         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) 呢? 后者当然也可以, 但却因此必须包含 



                    CGraphView 的声明;而如果你因为这个原因而包含GraphView。h 档,又会产生三个 



                    编译错误,挺麻烦! 



                    至此,Document  中虽然没有任何资料,但程序的UI  已经完备,编译联结后 

                  



                  可得以下执行画面: 



                   修改CGraphDoc,增加一个整数数组m_intArray ,这是真正存放资料的地方, 



                   我采用MFC  内建的CArray,为此,必须在STDAFX。H 中加上一行: 



                    #include        // MFC templates 



718 


…………………………………………………………Page 781……………………………………………………………

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



为了设定数组内容,我又增加了一个SetValue 成员函数,并且在【Graph Data】菜单 



命令被执行时,为m_intArray 设定不同的初值: 



    // in GRAPHDOC。H 

   class CGraphDoc : public CDocument 

    { 

    。。。 

   public: 

           CArray m_intArray; 



   public: 

           void SetValue(int i0; int i1; int i2; int i3; int i4; 

                           int i5; int i6; int i7; int i8; int i9); 

    。。。 

    }; 



    // in GRAPHDOC。CPP 

   CGraphDoc::CGraphDoc() 

    { 

           SetValue(5; 10; 15; 20; 25; 78; 64; 38; 29; 9); 

    } 

   void CGraphDoc::SetValue(int i0; int i1; int i2; int i3; int i4; 

                                 int i5; int i6; int i7; int i8; int i9); 

    { 

           m_intArray。SetSize(DATANUM; 0); 

           m_intArray'0' = i0; 

           m_intArray'1' = i1; 

           m_intArray'2' = i2; 

           m_intArray'3' = i3; 

           m_intArray'4' = i4; 

           m_intArray'5' = i5; 

           m_intArray'6' = i6; 

           m_intArray'7' = i7; 

           m_intArray'8' = i8; 

           m_intArray'9' = i9; 

    } 

   void CGraphDoc::OnGraphData1() 

    { 

           SetValue(5; 10; 15; 20; 25; 78; 64; 38; 29; 9); 

           UpdateAllViews(NULL); 

    } 

   void CGraphDoc::OnGraphData2() 

    { 

           SetValue(50; 60; 70; 80; 90; 23; 68; 39; 73; 58); 



                                                                                    719 


…………………………………………………………Page 782……………………………………………………………

                     第篇    深入  MFC  程式設計 



                                UpdateAllViews(NULL); 

                         } 

                        void CGraphDoc::OnGraphData3() 

                         { 

                                SetValue(12; 20; 8; 17; 28; 37; 93; 45; 78; 29); 

                                UpdateAllViews(NULL); 

                         } 

                        void CGraphDoc::OnUpdateGraphData1(CCmdUI* pCmdUI) 

                         { 

                                pCmdUI…》SetCheck(m_intArray'0' == 5); 

                         } 

                        void CGraphDoc::OnUpdateGraphData2(CCmdUI* pCmdUI) 

                         { 

                                pCmdUI…》SetCheck(m_intArray'0' == 50); 

                         } 

                        void CGraphDoc::OnUpdateGraphData3(CCmdUI* pCmdUI) 

                         { 

                                pCmdUI…》SetCheck(m_intArray'0' == 12); 

                         } 



                        各位看到,为了方便,我把m_intArray  的数据封装属性设为public  而非private , 



                        检查「m_intArray  内容究竟是哪一份资料」所用的方法也非常粗糙,呀,不要非难我, 



                        重点不在这里呀! 



                       在RESOURCE。H 文件中加上两个常数定义: 



                         #define DATANUM  10 

                         #define DATAMAX  100 



                            

                      修改CGraphView,在OnDraw 成员函数中取得Document ,再透过Document 



                      对象指针取得整数数组,然后将10 笔数据的曲线图绘出: 



                        #0001  void CGraphView::OnDraw(CDC* pDC) 

                        #0002  { 

                        #0003      CGraphDoc* pDoc = GetDocument(); 

                        #0004      ASSERT_VALID(pDoc); 

                        #0005 

                        #0006      int        cxDot;cxDotSpacing;cyDot; cxGraph;cyGraph; x;y; i; 

                        #0007      RECT       rc; 

                        #0008 

                        #0009      CPen   pen (PS_SOLID; 1; RGB(255; 0; 0)); // red pen 

                        #0010      CBrush brush(RGB(255; 0; 0));             // red brush 



720 


…………………………………………………………Page 783……………………………………………………………

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



   #0011      CBrush* pOldBrush = pDC…》SelectObject(&brush); 

   #0012      CPen*   pOldPen = pDC…》SelectObject(&pen); 

   #0013 

   #0014      cxGraph = 100; 

   #0015      cyGraph = DATAMAX;  // defined in resource。h 

   #0016 

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