目前完成度【 1/3 】,有任何建议欢迎反馈 【问卷调查】
contenteditable="true"

MFC - Windows Fundamentals 介绍

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

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

步骤1 -打开Visual Studio,然后单击File→New→Project菜单选项。

第2步-现在,您可以看到"New Project"对话框。

Windows Application

步骤3 -在左侧窗格中,选择 Templates→Visual C ++→Win32。

第4步-在中间窗格中,选择Win32 Project。

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

Select Win32 Project

步骤6 -单击"Next"。

Win32 Application Setting

步骤7 -选择如上所示对话框中所示的选项,然后单击"Finish"。

MFCWindowsDemo

步骤8 -创建了一个空项目。

步骤9 -要使其成为MFC项目,请右键单击该项目,然后选择"Properties"。

MFCWindowDemo Property Page

步骤10 -在左侧部分,单击配置 Properties→General。

步骤11 -在"Project Defaults"部分中选择"Shared DLL中使用MFC"选项,然后单击"OK"。

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

步骤13 -右键单击您的项目,然后选择Add→New Item...

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

MFCWindowDemo Add New Item

步骤15 -将"Name"设置为"Example",然后单击"Add"。

创建窗口

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

  • Class
  • Frame or Window

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

步骤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 Window

创建窗口后,要让应用程序使用它,可以使用指针显示用于创建窗口的类。在这种情况下,指针将为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 -运行上述应用程序时,将创建以下窗口。

Created Window

Windows Style

Windows样式是控制诸如窗口外观,边框,最小化或最大化状态或其他调整大小状态等功能的特征。

Sr.No.Style & Description
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样式创建一个重叠窗口。 Same as the WS_OVERLAPPEDWINDOW style.

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 Location

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

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 Size

当使用点在屏幕上定位对象时,每个窗口都有一个大小。大小提供了与对象相关的两个度量。

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

Win32库使用如下定义的SIZE结构-

typedef struct tagSIZE {
   int cx;
   int cy;
} SIZE;

除了Win32的SIZE结构外,MFC还提供了CSize类。此类具有与SIZE相同的功能,但增加了C ++类的功能。它提供了五个构造函数,可让您以任何选择的方式创建size变量。

CSize();
CSize(int initCX, int initCY);
CSize(SIZE initSize);
CSize(POINT initPt);
CSize(DWORD dwSize);

Windows Dimensions

当显示窗口时,可以通过其相对于显示器边框的位置在屏幕上进行识别。窗口也可以通过其宽度和高度来标识。这些特征由 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构造函数中指定的。最后两个参数是Window的大小。

Created Application Window

Windows Parents

在现实世界中,许多应用程序是由不同的Windows组成的。当应用程序使用各种Windows时,大多数对象都依赖于特定的Windows。它可以是创建的第一个窗口,也可以是您指定的另一个窗口。这样的窗口称为父窗口。所有其他窗口直接或间接依赖于它。

  • 如果要创建的窗口是另一个窗口的依赖项,则可以指定它具有父窗口。

  • 这是通过CFrameWnd::Create()方法的pParentWnd参数完成的。

  • 如果Window没有父项,请为参数传递NULL值。

让我们看一个只有一个Window且没有父Window可用的示例,因此我们将传递带有NULL值的参数,如以下代码所示-

class CMyFrame : public CFrameWnd {
   public:
      CMyFrame() {
         Create(NULL, _T("MFC Application Tutorial"), WS_SYSMENU, 
            CRect(90, 120, 550, 480), NULL);
      }
};

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

Created Application Window