MFC - Windows 基础知识

在本章中,我们将介绍 Windows 的基础知识。 要创建程序(也称为应用程序),您需要从 MFC 的 CWinApp 派生一个类。 CWinApp 代表Windows 应用程序的类。

让我们通过创建一个新的 Win32 项目来研究一个简单的示例。

步骤 1 − 打开 Visual Studio 并单击 File → New → Project menu 选项。

步骤 2 − 您现在可以看到"新建项目"对话框。

Windows 应用程序

步骤 3 − 从左侧窗格中选择 Templates → Visual C++ → Win32。

步骤 4 − 在中间窗格中,选择 Win32 项目。

步骤 5 − 在"名称"字段中输入项目名称"MFCWindowDemo",然后单击"确定"继续。 您将看到以下对话框。

选择 Win32 项目

步骤 6 − 单击"下一步"。

Win32 应用程序设置

步骤 7 − 选择上面给出的对话框中所示的选项,然后单击"完成"。

MFCWindowsDemo

步骤 8 − 创建一个空项目。

步骤 9 − 要使其成为 MFC 项目,请右键单击该项目并选择"属性"。

MFCWindowDemo 属性页

步骤 10 − 在左侧部分中,单击 Configuration Properties → General。

步骤 11 − 在"项目默认值"部分中选择"在共享 DLL 中使用 MFC"选项,然后单击"确定"。

步骤 12 − 添加新的源文件。

步骤 13 − 右键单击您的项目并选择"添加"→ 新项目...

步骤 14 − 在"模板"部分中,单击"C++ 文件 (.cpp)"。

MFCWindowDemo 添加新项

步骤 15 − 将名称设置为示例,然后单击"添加"。

窗口创建

任何应用程序都有两个主要部分 −

  • 框架或窗口

让我们使用以下步骤创建一个窗口 −

步骤 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 传递)和窗口的名称(将显示在标题栏上的字符串)。

Main 主窗口

创建窗口后,为了让应用程序使用它,可以使用指针来显示用于创建窗口的类。 在这种情况下,指针将为 CFrameWnd。 要使用框架窗口,请将其指针分配给 CWinThread::m_pMainWnd 成员变量。 这是在应用程序的 InitInstance() 实现中完成的。

步骤 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_OVERLAPPED 窗口

使用 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 − 当您运行此应用程序时,将创建以下窗口。

创建窗口

您现在可以看到最小化、最大化和关闭选项不再出现。

窗口位置

为了定位显示器上显示的内容,计算机使用类似于笛卡尔坐标系的坐标系,但原点位于屏幕的左上角。 使用该坐标系,可以通过水平轴和垂直轴到屏幕左上角的距离来定位任意点。

Win32 库提供了一个名为 POINT 的结构,定义如下 −

typedef struct tagPOINT {
   LONG x;
   LONG y;
} POINT;
  • 'x'成员变量是从屏幕左边框到该点的距离。

  • "y"变量表示从屏幕上边框到该点的距离。

  • 除了 Win32 的 POINT 结构之外,Microsoft 基础类 (MFC) 库还提供了 CPoint 类。

  • 这提供了与 POINT 结构相同的功能。 作为一个 C++ 类,它添加了定位点所需的更多功能。 它提供了两个构造函数。

CPoint();
CPoint(int X, int Y);

窗口大小

虽然一个点用于定位屏幕上的对象,但每个窗口都有一个大小。 大小提供了与对象相关的两种度量。

  • 对象的宽度。
  • 物体的高度。

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

窗口尺寸

当窗口显示时,可以通过其相对于监视器边框的位置在屏幕上识别它。 窗口还可以通过其宽度和高度来识别。 这些特征由 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 父窗口

在现实世界中,许多应用程序都是由不同的 Windows 组成的。 当应用程序使用各种 Windows 时,大多数对象都依赖于某一特定 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);
      }
};

当您运行上述应用程序时,您会看到相同的输出。

创建的应用程序窗口