MFC是C++的Microsoft Windows API
?MFC產生的應用程式使用了標準化的結構。
?MFC產生的應用程式短而運行速度快。
?VC++工具降低了編碼的複雜性,這當然了,很多代碼都由它代勞了,呵呵。
?MFC庫應用程式架構的功能非常豐富。
以上說的都是MFC庫的優點,雖然說MFC有著這樣多的優點,但我個人認為不能盲目的學習它,要想學好,那麼您必須先掌握C++,這是毋庸置疑的。可能剛開始的時候,您覺得收穫很大,也很有趣,但要進一步提高,沒有C++基礎是很難的。所以站長建議大家學習的時候要有先有後,這樣才能學好!
應用程式架構是一種類庫的超集。
我們現在先來看一個例子,看看MFC有多麼強大!您只需加一行代碼,甚至一行都不用加只需要點幾下滑鼠就可以建立一個windows 程式,不信,試一下:
1、開啟VC++6從菜單選擇NEW,給項目命名為"MyApp "。
2、選擇MFC AppWizard[exe] 選項,除STEP 1選擇單文檔外其他STEP預設。
3、在Class View選擇CMyAppView類的OnDraw()成員函數雙擊會在C++編譯器看到以下內容
void CMyAppView::OnDraw(CDC* pDC)
{
CMyAppDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
在 // TODO: add draw code for native data here的位置增加一行代碼
void CMyAppView::OnDraw(CDC* pDC)
{
CMyAppDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(10,10,"願vc線上能成為您學習vc最好的朋友!"); //增加的一行
// TODO: add draw code for native data here
}
完了,就這麼簡單。編譯運行。看到了嗎?這個程式具備WINDOWS程式的所有特性,例如有菜單、工具條、狀態列、最大化、關閉、甚至還有關於對話方塊、預覽列印.....全了,這就是AppWizard通過MFC動態建立的一個應用程式。從這個小例子可以看出用VC/MFC設計WINDOWS程式多麼方便。
下面我們看看書上的例子,以便更進一步瞭解應用程式架構。
1、先建立一個Win32 Application的應用程式。
2、選擇Project->Add to project->Files,分別建立一個名為MyApp.h和一個名為MyApp.cpp的檔案。
3、添加代碼:(最好照敲一下代碼到編譯器,別用Ctrl+C/Ctrl+V)
//***********************************************
// MyApp.h
//
class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CMyFrame:public CFrameWnd
{
public:
CMyFrame();
protected:
afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};
//*****************************************************
// MyApp.cpp
//
#include "afxwin.h"
#include "myapp.h"
CMyApp theApp;//建立一個CMyAPP對象
BOOL CMyApp::InitInstance ()
{
m_pMainWnd=new CMyFrame();
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow ();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd)
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
END_MESSAGE_MAP()
CMyFrame::CMyFrame(){
Create(NULL,"MYAPP Application");
}
void CMyFrame::OnLButtonDown (UINT nFlags,CPoint point)
{
TRACE("Entering CMyFrame::OnLButtonDown - %lx,%d,%d/n",
(long)nFlags,point.x ,point.y);
}
void CMyFrame::OnPaint ()
{
CPaintDC dc(this);
dc.TextOut (0,0,"Hello World!");
}
4、編譯運行,報錯。為什麼呢?原來還沒有添加MFC的支援,在Project Setting選項General屬性頁面選擇"Use MFC in a Static Library"
5、再按Ctrl+F5,怎麼樣,簡單吧?
讓我們看看這個程式中的一些元素。
①WinMain函數:Windows總是要求每個應用程式都要有WinMain函數的,您之所以看不見,是因為它已經隱藏在應用程式架構內部了。
②CMyApp類:CMyApp類的對象代表一個應用程式,CWinApp基類決定它的大部分行為。
③應用程式的啟動:當開始運行應用程式時WINDOWS會調用WinMain函數,WinMain會尋找該應用程式的全域對象theApp。
④CMyApp::InitInstance成員函數:發現theApp後自動調用重載的虛函數InitInstance來完成主視窗的構造和顯示工作。
⑤CWinApp::Run成員函數:WinMain在調用InitInstance之後緊接著調用Run函數,它被隱藏在基類中負責傳遞應用程式的訊息給相映的視窗。
⑥CMyFrame類:此類的對象代表著應用程式的主視窗。它的建構函式調用基類CFrameWnd的Create函數建立具體的視窗結構。
⑦CMyFrame::OnLButtonDown函數:示範訊息處理機制,當滑鼠坐鍵被按下這一事件被映射到CMyFrame的OnLButtonDown函數上,如果你選擇F5進行編譯啟動並執行話可以在調試視窗看到TRACE宏顯示的類似下面的資訊
Entering CMyFrame::OnLButtonDown - 1,309,119
Entering CMyFrame::OnLButtonDown - 1,408,221
⑧CMyFrame::OnPaint函數:應用程式每次重新繪製視窗都需要調用此函數,將顯示"Hello World!"放在這裡是因為每次視窗發生變化時保證"Hello World!"被顯示,你可以試著將語句:
CPaintDC dc(this);
dc.TextOut (0,0,"Hello World!");
寫在別出,例如寫在
void CMyFrame::OnLButtonDown (UINT nFlags,CPoint point)
{
TRACE("Entering CMyFrame::OnLButtonDown - %lx,%d,%d/n",
(long)nFlags,point.x ,point.y);
CPaintDC dc(this);
dc.TextOut (0,0,"Hello World!");
}
運行後當點擊左鍵時顯示"Hello World!",但當視窗最小化再最大化時"Hello World!"不見了。
⑧關閉應用程式:使用者關閉應用程式時會有一系列事件發生。首先CMyFrame對象被刪除,然後退出Run,進而退出WinMain,最後刪除CMyApp對象。
通過上面的樣本我們看見程式的大部分功能包含在基類CWinApp和CFrameWnd中,我們唯寫了很少的函數,便可以完成很複雜的功能。所以應用程式架構不僅僅是一種類庫,它還定義了應用程式的結構,除了基類外還包括WinMain函數,以及用來支援訊息處理、診斷、DLL、等都包含在應用程式架構中。