MFC - Windows 基礎



本章將介紹 Windows 的基礎知識。要建立一個程式(也稱為應用程式),需要從 MFC 的 CWinApp 派生一個類。CWinApp 代表Windows 應用程式類

讓我們透過建立一個新的 Win32 專案來了解一個簡單的示例。

步驟 1 - 開啟 Visual Studio 並單擊“檔案”→“新建”→“專案”選單選項。

步驟 2 - 現在您可以看到“新建專案”對話方塊。

Windows Application

步驟 3 - 從左側窗格中,選擇“模板”→“Visual C++”→“Win32”。

步驟 4 - 在中間窗格中,選擇“Win32 專案”。

步驟 5 - 在“名稱”欄位中輸入專案名稱“MFCWindowDemo”,然後單擊“確定”繼續。您將看到以下對話方塊。

Select Win32 Project

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

Win32 Application Setting

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

MFCWindowsDemo

步驟 8 - 建立了一個空專案。

步驟 9 - 要將其設為 MFC 專案,請右鍵單擊該專案並選擇“屬性”。

MFCWindowDemo Property Page

步驟 10 - 在左側部分,單擊“配置屬性”→“常規”。

步驟 11 - 在“專案預設值”部分中選擇“在共享 DLL 中使用 MFC”選項,然後單擊“確定”。

步驟 12 - 新增新的原始檔。

步驟 13 - 右鍵單擊您的專案,然後選擇“新增”→“新建項…”。

步驟 14 - 在“模板”部分中,單擊“C++ 檔案 (.cpp)”。

MFCWindowDemo Add New Item

步驟 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 - 當我們執行上述應用程式時,將建立以下視窗。

Created Window

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 - 當您執行此應用程式時,將建立以下視窗。

Created Window

您現在可以看到最小化、最大化和關閉選項不再出現。

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 建構函式中的前兩個引數中指定的。最後兩個引數是視窗的大小。

Created Application Window

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

執行上述應用程式時,您將看到相同的輸出。

Created Application Window
廣告