小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

CView類的使用

 pphsy 2017-12-14

首先我們來寫一個例子:

1.建一個win32簡單應用程序,不要認為這樣就不能寫出MFC程序,因為是不是MFC程序取決于調(diào)沒調(diào)MFC函數(shù)。

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

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

4.Project-->Settings菜單項中設置使用MFC庫

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;//視圖類對象  
  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)建對象  
  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.     //將視圖設置為活動視圖  
  51.     //方式1:調(diào)用函數(shù)    
  52.     //  SetActiveView(m_pWndView);  
  53.     //方式2:指針賦值  
  54.     m_pViewActive = m_pWndView;  
  55.   
  56.     return 0;  
  57. }  
  58. //應用程序類  
  59. class CViewApp :public CWinApp  
  60. {  
  61. public:  
  62.     virtual BOOL InitInstance();  
  63.   
  64.   
  65. };  
  66. CViewApp theApp;//唯一的應用程序?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ù)用起來簡單  
  73.     //將窗口設置為應用程序主窗口  
  74.     m_pMainWnd = pFrame;  
  75.     //顯示和更新  
  76.     pFrame->ShowWindow(SW_SHOW);  
  77.     pFrame->UpdateData();  
  78.   
  79.     return TRUE;  
  80. }  
注意:

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

思考&提升:

1. 為什么非要使用視圖類的指針來?

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

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

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

3.  為什么要將視圖對象設置為框架窗口的活動視圖?

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



菜單消息都屬于命令消息,所以我們找CFrameWnd 的 OnCmdMsg,雙擊進入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. }  

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


4.OnPaintOnDraw之間的關系?

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



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

框架窗口:就好像個容器,負責裝各種各樣的子窗口
視圖窗口:是一種子窗口,父類是框架窗口,負責顯示數(shù)據(jù)。這樣做是因為當應用程序比較復雜時,我們希望一個類去做一件事


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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多