首先我們來(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.編寫代碼:
- #include "stdafx.h"
- #include "resource.h"
- //視圖類(創(chuàng)建方式與工具欄與工具欄步驟相似)
- class CMyView:public CView
- {
- public:
- virtual void OnDraw( CDC* pDC );
- DECLARE_MESSAGE_MAP ()
- protected:
- afx_msg void OnTest();
-
- };
- BEGIN_MESSAGE_MAP(CMyView,CView)
- ON_COMMAND(ID_TEST,OnTest)
- END_MESSAGE_MAP()
-
- void CMyView::OnTest()
- {
- MessageBox("CMView::OnTest");
- }
- void CMyView::OnDraw( CDC* pDC )
- {
- pDC->TextOut(100,100,"Hello World!");
- }
- //框架窗口類
- class CMainFrame :public CFrameWnd
- {
- public:
- // CMyView m_wndView;//視圖類對(duì)象
- CMyView*m_pWndView;//視圖類的指針
- DECLARE_MESSAGE_MAP()
- protected:
- afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );
-
- };
- BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
- ON_WM_CREATE()
- END_MESSAGE_MAP()
-
- int CMainFrame::OnCreate( LPCREATESTRUCT lpCreateStruct )
- {
- if(-1==CFrameWnd::OnCreate(lpCreateStruct))//父類的
- {
- return -1;
- }
- //創(chuàng)建視圖窗口
- m_pWndView = new CMyView;//在堆中創(chuàng)建對(duì)象
- m_pWndView->Create(NULL,"MyView",WS_VISIBLE|WS_CHILD|WS_BORDER,CRect(0,0,100,100),
- this,AFX_IDW_PANE_FIRST);//AFX_IDW_PANE_FIRST可使邊框和客戶區(qū)重疊
- //將視圖設(shè)置為活動(dòng)視圖
- //方式1:調(diào)用函數(shù)
- // SetActiveView(m_pWndView);
- //方式2:指針賦值
- m_pViewActive = m_pWndView;
-
- return 0;
- }
- //應(yīng)用程序類
- class CViewApp :public CWinApp
- {
- public:
- virtual BOOL InitInstance();
-
-
- };
- CViewApp theApp;//唯一的應(yīng)用程序?qū)ο?nbsp;
- BOOL CViewApp::InitInstance()
- {
- //創(chuàng)建基本的主框架窗口
- CMainFrame *pFrame = new CMainFrame;
- //創(chuàng)建窗口,內(nèi)部調(diào)用Create函數(shù)
- pFrame->LoadFrame(IDR_MENU1);//比Create函數(shù)用起來(lái)簡(jiǎn)單
- //將窗口設(shè)置為應(yīng)用程序主窗口
- m_pMainWnd = pFrame;
- //顯示和更新
- pFrame->ShowWindow(SW_SHOW);
- pFrame->UpdateData();
-
- return TRUE;
- }
注意:
實(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()中得到
- BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra,
- AFX_CMDHANDLERINFO* pHandlerInfo)
- {
- CPushRoutingFrame push(this);
-
- // pump through current view FIRST
- CView* pView = GetActiveView();
- if (pView != NULL && pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
- return TRUE;
-
- // then pump through frame
- if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
- return TRUE;
-
- // last but not least, pump through app
- CWinApp* pApp = AfxGetApp();
- if (pApp != NULL && pApp->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
- return TRUE;
-
- return FALSE;
- }
可以看出:處理菜單等命令消息的先后順序: 活動(dòng)視圖->框架窗口->應(yīng)用程序
4.OnPaint與OnDraw之間的關(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è)類去做一件事
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。