乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      CView類的使用

       pphsy 2017-12-14

      首先我們來(lái)寫一個(gè)例子:

      1.建一個(gè)win32簡(jiǎn)單應(yīng)用程序,不要認(rèn)為這樣就不能寫出MFC程序,因?yàn)槭遣皇荕FC程序取決于調(diào)沒(méi)調(diào)MFC函數(shù)。

      2. 刪除入口函數(shù),只留下#include "stdafx.h"

      3.將stdafx.h中的頭文件 <windows.h> 更改為 <afxwin.h>。

      4.Project-->Settings菜單項(xiàng)中設(shè)置使用MFC庫(kù)

      5.編寫代碼

      1. #include "stdafx.h"  
      2. #include "resource.h"  
      3. //視圖類(創(chuàng)建方式與工具欄與工具欄步驟相似)  
      4. class CMyView:public CView  
      5. {  
      6. public:  
      7.     virtual void OnDraw( CDC* pDC );  
      8.     DECLARE_MESSAGE_MAP ()  
      9. protected:  
      10.     afx_msg void OnTest();  
      11.   
      12. };  
      13. BEGIN_MESSAGE_MAP(CMyView,CView)  
      14. ON_COMMAND(ID_TEST,OnTest)  
      15. END_MESSAGE_MAP()  
      16.   
      17. void CMyView::OnTest()  
      18. {  
      19.     MessageBox("CMView::OnTest");  
      20. }  
      21. void CMyView::OnDraw( CDC* pDC )  
      22. {  
      23.     pDC->TextOut(100,100,"Hello World!");  
      24. }  
      25. //框架窗口類  
      26. class CMainFrame :public CFrameWnd  
      27. {  
      28. public:  
      29. //  CMyView m_wndView;//視圖類對(duì)象  
      30.     CMyView*m_pWndView;//視圖類的指針  
      31.     DECLARE_MESSAGE_MAP()  
      32. protected:  
      33.     afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );  
      34.       
      35. };  
      36. BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)  
      37. ON_WM_CREATE()  
      38. END_MESSAGE_MAP()  
      39.   
      40. int CMainFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )   
      41. {  
      42.     if(-1==CFrameWnd::OnCreate(lpCreateStruct))//父類的  
      43.     {  
      44.         return -1;  
      45.     }  
      46.     //創(chuàng)建視圖窗口  
      47.     m_pWndView = new CMyView;//在堆中創(chuàng)建對(duì)象  
      48.     m_pWndView->Create(NULL,"MyView",WS_VISIBLE|WS_CHILD|WS_BORDER,CRect(0,0,100,100),  
      49.         this,AFX_IDW_PANE_FIRST);//AFX_IDW_PANE_FIRST可使邊框和客戶區(qū)重疊  
      50.     //將視圖設(shè)置為活動(dòng)視圖  
      51.     //方式1:調(diào)用函數(shù)    
      52.     //  SetActiveView(m_pWndView);  
      53.     //方式2:指針賦值  
      54.     m_pViewActive = m_pWndView;  
      55.   
      56.     return 0;  
      57. }  
      58. //應(yīng)用程序類  
      59. class CViewApp :public CWinApp  
      60. {  
      61. public:  
      62.     virtual BOOL InitInstance();  
      63.   
      64.   
      65. };  
      66. CViewApp theApp;//唯一的應(yīng)用程序?qū)ο?nbsp; 
      67. BOOL CViewApp::InitInstance()  
      68. {  
      69.     //創(chuàng)建基本的主框架窗口  
      70.     CMainFrame *pFrame = new CMainFrame;  
      71.     //創(chuàng)建窗口,內(nèi)部調(diào)用Create函數(shù)  
      72.     pFrame->LoadFrame(IDR_MENU1);//比Create函數(shù)用起來(lái)簡(jiǎn)單  
      73.     //將窗口設(shè)置為應(yīng)用程序主窗口  
      74.     m_pMainWnd = pFrame;  
      75.     //顯示和更新  
      76.     pFrame->ShowWindow(SW_SHOW);  
      77.     pFrame->UpdateData();  
      78.   
      79.     return TRUE;  
      80. }  
      注意:

      實(shí)例化CMyView對(duì)象前必須重寫OnDraw()函數(shù),因?yàn)镺nDraw()是純虛函數(shù)
              視圖窗口的創(chuàng)建是在CMainFrame的 OnCreate()函數(shù)中調(diào)Create函數(shù)

      思考&提升:

      1. 為什么非要使用視圖類的指針來(lái)?

       由于在CView::PostNcDestroy()函數(shù)中,調(diào)用了delete this;  所以,視圖對(duì)象的創(chuàng)建放到堆中,即new 對(duì)象,

      2. 創(chuàng)建視圖時(shí),怎樣視圖鋪滿框架窗口的客戶區(qū)?

      創(chuàng)建時(shí)視圖的ID填AFX_IDW_PANE_FIRST

      3.  為什么要將視圖對(duì)象設(shè)置為框架窗口的活動(dòng)視圖?

      因?yàn)?處理菜單等命令消息的先后順序: 活動(dòng)視圖->框架窗口->應(yīng)用程序。我們將對(duì)此進(jìn)行驗(yàn)證:在消息提示框那行加斷點(diǎn),調(diào)試運(yùn)行,我們通過(guò)調(diào)用堆棧得到下圖調(diào)用信息



      菜單消息都屬于命令消息,所以我們找CFrameWnd 的 OnCmdMsg,雙擊進(jìn)入CFrameWnd::OnCmdMsg()中得到

      1. BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra,  
      2.     AFX_CMDHANDLERINFO* pHandlerInfo)  
      3. {  
      4.     CPushRoutingFrame push(this);  
      5.   
      6.     // pump through current view FIRST  
      7.     CView* pView = GetActiveView();  
      8.     if (pView != NULL && pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))  
      9.         return TRUE;  
      10.   
      11.     // then pump through frame  
      12.     if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))  
      13.         return TRUE;  
      14.   
      15.     // last but not least, pump through app  
      16.     CWinApp* pApp = AfxGetApp();  
      17.     if (pApp != NULL && pApp->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))  
      18.         return TRUE;  
      19.   
      20.     return FALSE;  
      21. }  

      可以看出:處理菜單等命令消息的先后順序: 活動(dòng)視圖->框架窗口->應(yīng)用程序


      4.OnPaintOnDraw之間的關(guān)系?

      OnPaint調(diào)的是OnDraw。因?yàn)?/span>OnDraw函數(shù)比OnPaint更簡(jiǎn)單,不用添加消息映射所以視圖的信息顯示,直接在OnDraw函數(shù)中。



      5.為什么不用框架窗口的客戶區(qū)顯示數(shù)據(jù),而非要用視圖窗口顯示?

      框架窗口:就好像個(gè)容器,負(fù)責(zé)裝各種各樣的子窗口
      視圖窗口:是一種子窗口,父類是框架窗口,負(fù)責(zé)顯示數(shù)據(jù)。這樣做是因?yàn)楫?dāng)應(yīng)用程序比較復(fù)雜時(shí),我們希望一個(gè)類去做一件事


        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多