1、建立一個SDI程序“3SDI”
2、介紹SDI程序中的App類,Frame類,View類,Doc類,以及他們之間的相互關系。
3、WinMain咋不見了?簡單的跟蹤執行,理解SDI執行過程。
4、在View類的OnDraw中輸出”Hello world!”
5、事件、消息、虛函數
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
ON_WM_CREATE()
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
ON_WM_KEYDOWN()
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
ON_WM_LBUTTONDOWN()
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) //static
afx_msg void OnAppAbout();
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual void OnDraw(CDC* pDC); // overridden to draw this view
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
ON_WM_ERASEBKGND()
BOOL CSDIView::OnEraseBkgnd(CDC* pDC)
{
static BOOL bDone = FALSE;
if (bDone == FALSE)
{
bDone = TRUE;
HBRUSH hBrush = (HBRUSH)::GetStockObject(BLACK_BRUSH);
::SetClassLong(m_hWnd, GCL_HBRBACKGROUND, (LONG)hBrush);
//聯想到::SetWindowLong()函數,作用是?
}
return CView::OnEraseBkgnd(pDC);
}
在前面的課程中,我們處理消息時,除了要判斷主消息值uMsg外,總是要判斷wParam和lParam這2個附加消息參數,以完整的表達一個消息的全部含義。但上面的OnKeyDown和OnLButtonDown中,我們沒有見到wParam和lParam的身影,這是因為MFC已經智能的幫助我們將這2個參數轉換成了相應消息函數的參數了,轉換後的參數直接表明了參數的具體含義,更加人性化了。www.2cto.com
PreCreateWindow和OnCreate的不同在於:OnCreate是消息WM_CREATE的響應函數,是由::CreateWindow函數觸發的消息。而PreCreateWindow不對應任何消息,它只是一個虛函數,是在其父類中的::CreateWindow函數之前調用的,是為了給程序員一個在CreateWindow執行之前改變窗口外觀的機會。OnCreate和PreCreateWindow函數的參數中都涉及到了一個CREATESTRUCT結構,其作用相同。PreCreateWindow先執行,OnCreate後執行。
由此可以推斷,虛函數OnDraw也是類似的作用,是在消息WM_PAINT的響應函數OnPaint中進行調用的。實際情況也是如此,可以跟蹤MFC的核心代碼可以證實這點。
[cpp]
//文件VIEWCORE.CPP代碼片段:
void CView::OnPaint()
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}
//文件VIEWCORE.CPP代碼片段:
void CView::OnPaint()
{
// standard paint routine
CPaintDC dc(this);
OnPrepareDC(&dc);
OnDraw(&dc);
}
6、預編譯頭文件stdafx.h,對MFC源代碼的引用就在這裡。
[cpp]
#include <afxwin.h> // MFC核心和標准組
#include <afxext.h> // MFC擴展
#include <afxdisp.h> // MFC自動化類
#include <afxdtctl.h> // MFC支持的IE4的通用控件
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC支持的Windows通用控件
#endif // _AFX_NO_AFXCMN_SUPPORT