程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> VC++ >> VC精華教程:MFC入門系列(一)

VC精華教程:MFC入門系列(一)

編輯:VC++

  程序作者: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();
};


  在這個類中僅僅重寫了兩個函數,一個InitInstance(),一個ExitInstance(),這個類是控制整個應用程序的,所以稱為CWinApp類,是不可或缺的一個類。而且要運行程序,要將該類實例化。實例化會自動調用構造函數,並調用InitInstance()這個函數(調用該函數是MFC寫好的, InitInstance()並不是憑空就調用的,而是MFC包裝了API函數WinMain,在全局對象實例化後(App a; ),就進入WinMain函數,在裡面由MFC這個框架已經寫好對InitInstance()的調用,我們進入MFC的源碼即可看到),因為該函數是一個虛函數,所以我們實例化繼承CWinApp類的App類時,會自動調用App::InitInstance()(如果不明白,請復習c++的虛函數),這樣就開始了一個應用程序實例的進程。來到的App::InitInstance()函數。

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);


  通過這一句,用指針調用類的成員函數,在CFrameWnd中,還封裝了ShowWindow這個API函數,用法和API函數一樣。

  在return TRUE;這句之後該函數結束。

  程序進入了運行狀態,在關閉程序的時候,會調用ExitInstance()這個函數,該函數僅僅輸出一個消息框就結束了。那麼這個簡單的MFC程序就講到這裡了。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved