MFC - Windows基础版

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

让我们通过创建一个新的Win32项目来看一个简单的例子.

第1步 : 打开Visual studio并单击File → 新的 → 项目菜单选项.

第2步 : 您现在可以看到New Project对话框.

Windows Application

第3步 : 从左侧窗格中,选择Templates →  Visual C ++ →  Win32.

第4步 : 在中间窗格中,选择Win32 Project.

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

Select Win32 Project

第6步 : 单击下一步.

Win32 Application Setting

步骤7 : 选择上面给出的对话框中显示的选项,然后单击Finish.

MFCWindowsDemo

第8步 : 创建一个空项目.

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

MFCWindowDemo Property Page

第10步 : 在左侧部分中,单击"配置属性"和"rarr";一般.

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

步骤12 : 添加新的源文件.

步骤13 : 右键单击Project并选择Add → 新项目......

步骤14 : 在"模板"部分中,单击"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传递,以及窗口的名称,它是将在标题栏上显示的字符串.

主窗口

创建窗口后,为了让应用程序使用它,您可以使用指针来显示用于创建窗口的类.在这种情况下,指针将是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样式

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

Sr.No.风格&说明
1

WS_BORDER

创建一个带边框的窗口.

2

WS_CAPTION

创建一个具有标题的窗口bar(暗示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样式定义的所有控件都属于同一个组.具有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样式组合才能使Control菜单可见.

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基础类(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构造函数中所指定.最后两个参数是Window的大小.

Created Application Window

Windows父母

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

  • 如果您创建的窗口依赖于另一个窗口,则可以指定它有父级.

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

  • 如果Window没有父项,则传递带有NULL值的参数.

让我们看一个只有一个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