
- MFC 教程
- MFC - 首頁
- MFC - 概述
- MFC - 環境設定
- MFC - VC++ 專案
- MFC - 入門
- MFC - Windows 基礎
- MFC - 對話方塊
- MFC - Windows 資源
- MFC - 屬性表
- MFC - Windows 佈局
- MFC - 控制元件管理
- MFC - Windows 控制元件
- MFC - 訊息與事件
- MFC - ActiveX 控制元件
- MFC - 檔案系統
- MFC - 標準 I/O
- MFC - 文件檢視
- MFC - 字串
- MFC - Carray 陣列
- MFC - 連結串列
- MFC - 資料庫類
- MFC - 序列化
- MFC - 多執行緒
- MFC - 網際網路程式設計
- MFC - GDI
- MFC - 庫
- MFC 有用資源
- MFC - 快速指南
- MFC - 有用資源
- MFC - 討論
MFC - Windows 基礎
本章將介紹 Windows 的基礎知識。要建立一個程式(也稱為應用程式),需要從 MFC 的 CWinApp 派生一個類。CWinApp 代表Windows 應用程式類。
讓我們透過建立一個新的 Win32 專案來了解一個簡單的示例。
步驟 1 - 開啟 Visual Studio 並單擊“檔案”→“新建”→“專案”選單選項。
步驟 2 - 現在您可以看到“新建專案”對話方塊。

步驟 3 - 從左側窗格中,選擇“模板”→“Visual C++”→“Win32”。
步驟 4 - 在中間窗格中,選擇“Win32 專案”。
步驟 5 - 在“名稱”欄位中輸入專案名稱“MFCWindowDemo”,然後單擊“確定”繼續。您將看到以下對話方塊。

步驟 6 - 單擊“下一步”。

步驟 7 - 選擇上面對話方塊中所示的選項,然後單擊“完成”。

步驟 8 - 建立了一個空專案。
步驟 9 - 要將其設為 MFC 專案,請右鍵單擊該專案並選擇“屬性”。

步驟 10 - 在左側部分,單擊“配置屬性”→“常規”。
步驟 11 - 在“專案預設值”部分中選擇“在共享 DLL 中使用 MFC”選項,然後單擊“確定”。
步驟 12 - 新增新的原始檔。
步驟 13 - 右鍵單擊您的專案,然後選擇“新增”→“新建項…”。
步驟 14 - 在“模板”部分中,單擊“C++ 檔案 (.cpp)”。

步驟 15 - 將名稱設定為 Example 並單擊“新增”。
視窗建立
任何應用程式都有兩個主要部分:
- 類
- 框架或視窗
讓我們按照以下步驟建立一個視窗:
步驟 1 - 要建立應用程式,我們需要從 MFC 的 CWinApp 派生一個類。
#include class CExample : public CWinApp { BOOL InitInstance() { return TRUE; } };
步驟 2 - 我們還需要一個框架/視窗來顯示應用程式的內容。
步驟 3 - 為此,我們需要新增另一個類並將其從 MFC 的CFrameWnd類派生,並實現其建構函式並呼叫 Create() 方法,這將建立一個框架/視窗,如下面的程式碼所示。
class CMyFrame : public CFrameWnd { public: CMyFrame() { Create(NULL, _T("MFC Application Tutorial")); } };
步驟 4 - 如您所見,Create() 方法需要兩個引數:類的名稱(應將其作為 NULL 傳遞)和視窗的名稱(這是將在標題欄中顯示的字串)。
主視窗
建立視窗後,要讓應用程式使用它,可以使用指標來顯示用於建立視窗的類。在這種情況下,指標將是 CFrameWnd。要使用框架視窗,請將其指標分配給應用程式的 InitInstance() 實現中的 CWinThread::m_pMainWnd 成員變數。
步驟 1 - 這是 CExample 類中 InitInstance() 的實現。
class CExample : public CWinApp { BOOL InitInstance() { CMyFrame *Frame = new CMyFrame(); m_pMainWnd = Frame; Frame->ShowWindow(SW_NORMAL); Frame->UpdateWindow(); return TRUE; } };
步驟 2 - 以下是 Example.cpp 檔案的完整實現。
#include <afxwin.h> class CMyFrame : public CFrameWnd { public: CMyFrame() { Create(NULL, _T("MFC Application Tutorial")); } }; class CExample : public CWinApp { BOOL InitInstance() { CMyFrame *Frame = new CMyFrame(); m_pMainWnd = Frame; Frame->ShowWindow(SW_NORMAL); Frame->UpdateWindow(); return TRUE; } }; CExample theApp;
步驟 3 - 當我們執行上述應用程式時,將建立以下視窗。

Windows 樣式
Windows 樣式是控制視窗外觀、邊框、最小化或最大化狀態或其他調整大小狀態等功能的特性。
序號 | 樣式和說明 |
---|---|
1 | WS_BORDER 建立一個帶邊框的視窗。 |
2 | WS_CAPTION 建立一個帶標題欄的視窗(暗示 WS_BORDER 樣式)。不能與 WS_DLGFRAME 樣式一起使用。 |
3 | WS_CHILD 建立一個子視窗。不能與 WS_POPUP 樣式一起使用。 |
4 | WS_CHILDWINDOW 與 WS_CHILD 樣式相同。 |
5 | WS_CLIPCHILDREN 在父視窗內繪圖時,排除子窗口占據的區域。在建立父視窗時使用。 |
6 | WS_CLIPSIBLINGS 相互剪輯子視窗;也就是說,當特定子視窗收到繪製訊息時,WS_CLIPSIBLINGS 樣式會將所有其他重疊的子視窗剪輯到要更新的子視窗區域之外。(如果沒有給出 WS_CLIPSIBLINGS 並且子視窗重疊,當您在子視窗的客戶區內繪製時,可以在相鄰子視窗的客戶區內繪製。)僅與 WS_CHILD 樣式一起使用。 |
7 | WS_DISABLED 建立一個最初停用的視窗。 |
8 | WS_DLGFRAME 建立一個帶雙邊框但沒有標題的視窗。 |
9 | WS_GROUP 指定一組控制元件的第一個控制元件,使用者可以使用箭頭鍵在這些控制元件之間移動。在第一個控制元件之後定義的所有 WS_GROUP 樣式為 FALSE 的控制元件都屬於同一組。下一個具有 WS_GROUP 樣式的控制元件將啟動下一個組(即,一個組在下一個組開始的地方結束)。 |
10 | WS_HSCROLL 建立一個帶水平捲軸的視窗。 |
11 | WS_ICONIC 建立一個最初最小化的視窗。與 WS_MINIMIZE 樣式相同。 |
12 | WS_MAXIMIZE 建立一個最大尺寸的視窗。 |
13 | WS_MAXIMIZEBOX 建立一個帶最大化按鈕的視窗。 |
14 | WS_MINIMIZE 建立一個最初最小化的視窗。僅與 WS_OVERLAPPED 樣式一起使用。 |
15 | WS_MINIMIZEBOX 建立一個帶最小化按鈕的視窗。 |
16 | WS_OVERLAPPED 建立一個重疊視窗。重疊視窗通常具有標題欄和邊框。 |
17 | WS_OVERLAPPEDWINDOW 使用 WS_OVERLAPPED、WS_CAPTION、WS_SYSMENU、WS_THICKFRAME、WS_MINIMIZEBOX 和 WS_MAXIMIZEBOX 樣式建立一個重疊視窗。 |
18 | WS_POPUP 建立一個彈出視窗。不能與 WS_CHILD 樣式一起使用。 |
19 | WS_POPUPWINDOW 使用 WS_BORDER、WS_POPUP 和 WS_SYSMENU 樣式建立一個彈出視窗。必須將 WS_CAPTION 樣式與 WS_POPUPWINDOW 樣式組合才能使控制選單可見。 |
20 | WS_SIZEBOX 建立一個帶大小調整邊框的視窗。與 WS_THICKFRAME 樣式相同。 |
21 | WS_SYSMENU 建立一個在其標題欄中具有控制選單框的視窗。僅用於帶標題欄的視窗。 |
22 | WS_TABSTOP 指定任何數量的控制元件之一,使用者可以使用 TAB 鍵在這些控制元件之間移動。TAB 鍵將使用者移動到 WS_TABSTOP 樣式指定的下一個控制元件。 |
23 | WS_THICKFRAME 建立一個具有粗邊框的視窗,該邊框可用於調整視窗大小。 |
24 | WS_TILED 建立一個重疊視窗。重疊視窗具有標題欄和邊框。與 WS_OVERLAPPED 樣式相同。 |
25 | WS_TILEDWINDOW 使用 WS_OVERLAPPED、WS_CAPTION、WS_SYSMENU、WS_THICKFRAME、WS_MINIMIZEBOX 和 WS_MAXIMIZEBOX 樣式建立一個重疊視窗。與 WS_OVERLAPPEDWINDOW 樣式相同。 |
26 | WS_VISIBLE 建立一個最初可見的視窗。 |
27 | WS_VSCROLL 建立一個帶垂直捲軸的視窗。 |
步驟 1 - 讓我們來看一個簡單的例子,在這個例子中我們將新增一些樣式。建立視窗後,要將其顯示給使用者,我們可以對其應用 WS_VISIBLE 樣式,此外,我們還將新增 WS_OVERLAPPED 樣式。這是一個實現:
class CMyFrame : public CFrameWnd { public: CMyFrame() { Create(NULL, _T("MFC Application Tutorial"), WS_VISIBLE | WS_OVERLAPPED); } };
步驟 2 - 當您執行此應用程式時,將建立以下視窗。

您現在可以看到最小化、最大化和關閉選項不再出現。
Windows 位置
為了定位顯示在監視器上的內容,計算機使用類似於笛卡爾座標系的座標系,但原點位於螢幕的左上角。使用此座標系,任何點都可以透過其到螢幕左上角的水平和垂直軸的距離來定位。
Win32 庫提供了一個名為 POINT 的結構,定義如下:
typedef struct tagPOINT { LONG x; LONG y; } POINT;
“x”成員變數是從螢幕的左邊界到該點的距離。
“y”變量表示從螢幕頂部邊界到該點的距離。
除了 Win32 的 POINT 結構外,Microsoft Foundation Class (MFC) 庫還提供 CPoint 類。
這提供了與 POINT 結構相同的功用。作為一個 C++ 類,它增加了定位點所需的更多功能。它提供了兩個建構函式。
CPoint(); CPoint(int X, int Y);
Windows 大小
雖然點用於定位螢幕上的物件,但每個視窗都有一個大小。大小提供了與物件相關的兩個度量。
- 物件的寬度。
- 物件的高度。
Win32 庫使用定義如下 SIZE 結構:
typedef struct tagSIZE { int cx; int cy; } SIZE;
除了 Win32 的 SIZE 結構外,MFC 還提供 CSize 類。此類具有與 SIZE 相同的功能,但增加了 C++ 類的功能。它提供了五個建構函式,允許您以任何您選擇的方式建立大小變數。
CSize(); CSize(int initCX, int initCY); CSize(SIZE initSize); CSize(POINT initPt); CSize(DWORD dwSize);
Windows 尺寸
當視窗顯示時,可以透過其相對於監視器邊界的 位置來識別它在螢幕上的位置。還可以透過其寬度和高度來識別視窗。這些特性由Create()方法的rect引數指定或控制。此引數是一個可以透過 Win32 RECT 結構建立的矩形。
typedef struct _RECT { LONG left; LONG top; LONG right; LONG bottom; } RECT, *PRECT;
除了 Win32 的RECT結構外,MFC 還提供 CRect 類,它具有以下建構函式:
CRect(); CRect(int l, int t, int r, int b); CRect(const RECT& srcRect); CRect(LPCRECT lpSrcRect); CRect(POINT point, SIZE size); CRect(POINT topLeft, POINT bottomRight);
讓我們來看一個簡單的例子,在這個例子中我們將指定視窗的位置和大小
class CMyFrame : public CFrameWnd { public: CMyFrame() { Create(NULL, _T("MFC Application Tutorial"), WS_SYSMENU, CRect(90, 120, 550, 480)); } };
當您執行此應用程式時,將在螢幕的左上角建立以下視窗,如 CRect 建構函式中的前兩個引數中指定的。最後兩個引數是視窗的大小。

Windows 父視窗
在現實世界中,許多應用程式是由不同的視窗組成的。當一個應用程式使用多個視窗時,大多數物件依賴於一個特定的視窗。這可能是建立的第一個視窗,也可能是您指定的另一個視窗。這樣的視窗被稱為父視窗。所有其他視窗都直接或間接地依賴於它。
如果您正在建立的視窗依賴於另一個視窗,您可以指定它具有父視窗。
這是透過`CFrameWnd::Create()`方法的`pParentWnd`引數實現的。
如果視窗沒有父視窗,則使用`NULL`值傳遞該引數。
讓我們來看一個只有一個視窗的例子,並且沒有可用的父視窗,因此我們將使用`NULL`值傳遞引數,如下面的程式碼所示:
class CMyFrame : public CFrameWnd { public: CMyFrame() { Create(NULL, _T("MFC Application Tutorial"), WS_SYSMENU, CRect(90, 120, 550, 480), NULL); } };
執行上述應用程式時,您將看到相同的輸出。
