程序作者:zhoujiamurong 個人郵箱:[email protected]
作者保留作品的所有權利,如需轉載請聯系作者。
該文章為學習了C和C++以及有SDK編程基礎的,但還未學習MFC的人員使用,我們開始使用一個基本的內容開始:
全部的代碼如下:
#include
class sample:public CFrameWnd
{
public:
sample()
{
Create(NULL,"MFC Window");
MessageBox("My MFC Window","CFrame constructor",MB_OK);
}
};
class App:public CWinApp
{
public:
BOOL InitInstance();
BOOL ExitInstance();
};
BOOL App::InitInstance()
{
MessageBox(0,"My MFC Window","InitInstance",MB_OK|MB_ICONASTERISK);
sample *obj;
obj=new sample;
m_pMainWnd=obj;
obj->ShowWindow(SW_SHOWMAXIMIZED);
return TRUE;
}
BOOL App::ExitInstance()
{
MessageBox(0,"My Window","ExitInstance",MB_OK|MB_ICONHAND);
return TRUE;
}
App a;
你只需將以上代碼拷貝下來,在VC++6.0編譯器,建一個Window32工程,使用MFC鏈接庫編譯即可。
具體步驟:打開VC++6.0,點擊主菜單File(文件)-〉New(新建) 彈出一個對話框,我們選擇win32
Application(win32應用程序),再工程文本框給它起一個名字MyMFC,點擊確定。在確認信息的對話框裡選擇空工程an
empty project點確定。這樣我們就建了一個win32 應用程序這樣一個類型的工程。下面我們在這個工程裡建一個C++文件。點擊菜單File(文件)-〉New(新建)
彈出一個對話框,選擇C++ source文件(C++源文件),再文件文本框裡給他起個名字MyMFC,點擊確定,這是我們將上面的代碼拷入,編譯鏈接。你會發現有3個錯誤。
nafxcwd.lib(thrdcore.obj):error LNK2001:unresolved external symbol_endthreadex
nafxcwd.lib(thrdcore.obj):error LNK2001:unresolved external symbol_beginthreadex
Debug/MyMFC.exe:fatal error LNK1120:2 unresolved externals
那麼,這是因為沒有使用MFC類庫。我們現在導入。點擊菜單(project)工程-〉setting設置,彈出一個對話框,有一個下拉列表框,裡面是Not
Using MFC,我們把她改為Using MFC in a Static Library,點擊確定,再編譯,運行,那麼有這樣一個窗體出現。下面是該程序的解釋。
在以上的程序中,只使用了兩個類CFrameWnd 和CWinApp,我們先看第一個類:
class sample:public CFrameWnd
{
public:
sample()
{
Create(NULL,"MFC Window");
MessageBox("My MFC Window","CFrame constructor",MB_OK);
}
};
第一個類sample繼承了CFrameWnd類,CFrame類是MFC類庫中的一個類,用它來代表窗體框架,我們先用sample類繼承它,在構造函數調用了Create這個函數,在運行Create這個函數時調用的是CFrameWnd類中的函數,是MFC寫好的函數,CFrameWnd中封裝了CreateWindow這個API函數為它的成員函數Create(),他們的參數都是相似的。但你會問,CreateWindow有11個參數,而這裡的Create函數只用了兩個參數,因為這裡的Create有兩個參數為必選參數,後面的參數有默認值。
由MSDN的定義可以看出
BOOL Create( LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD
dwStyle = WS_OVERLAPPEDWINDOW, const RECT& rect = rectDefault, CWnd*
pParentWnd = NULL, LPCTSTR lpszMenuName = NULL, DWORD dwExStyle = 0,
CCreateContext* pContext = NULL );
後面的參數都帶有一個等號和一個默認的值。
我們再看在看第二個類,繼承CWinApp類的App類。
class App:public CWinApp
{
public:
BOOL InitInstance();
BOOL ExitInstance();
};
BOOL App::InitInstance()
{
MessageBox(0,"My MFC Window","InitInstance",MB_OK|MB_ICONASTERISK);
sample *obj;
obj=new sample;
m_pMainWnd=obj;
obj->ShowWindow(SW_SHOWMAXIMIZED);
return TRUE;
}
在這個函數,首先法一個消息框出來,使用MessageBox函數,然後聲明一個sample類的指針obj,第三行,為該obj分配內存,即實例化,類的實例化要調用構造函數的初始化,程序的控制點到達sample類的sample函數:
sample()
{
Create(NULL,"MFC Window");
MessageBox("My MFC Window","CFrame constructor",MB_OK);
}
這裡才創建窗體,並且有一個消息框出現,然後程序控制點回到App::InitInstance()的m_pMainWnd=obj;位置。
這一塊是個難點,剛開始學的時候,我不明白m_pMainWnd,你從哪裡來,來了干什麼。他從類CWinThread裡來,他的定義為
CWnd* m_pMainWnd;
他憑什麼直接用?class CWinApp : public CWinThread 因為MFC中的CWinApp類繼承於CWinThread子類中用父類的成員變量,兒子用老爸的錢,當然可以拉,所以他可以直接用。
他有什麼用,我們看
sample *obj;
obj=new sample;
這兩個是在InitInstance()這個成員函數聲明的,也就是說,這個函數結束了,這個指針變量必然要析構,而這個指針是代表窗體框架的,這個指針釋放了,那麼,窗體也跟著消失了,所以,我們要把這個地址留下來,就給了m_pMainWnd這個指針了,他是在線程類中的,有線程他就在,程序結束了,沒線程了,他也消失了,窗體框架也就結束了。
到現在我們還只是在內存中,創建了一個窗體,沒有顯示出來,那麼
obj->ShowWindow(SW_SHOWMAXIMIZED);