MFC – Windows 基础
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 – 将名称设置为示例,然后单击添加。
窗口创建
任何应用程序都有两个主要部分 –
- 班级
- 框架或窗口
让我们使用以下步骤创建一个窗口 –
步骤 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 步– 当我们运行上述应用程序时,将创建以下窗口。
窗户样式
窗口样式是控制窗口外观、边框、最小化或最大化状态或其他调整大小状态等功能的特性。
Sr.No. | 风格和描述 |
---|---|
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 WINDOW 创建具有 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 Foundation Class (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 时,大多数对象都依赖于特定的对象。它可能是创建的第一个窗口或您指定的另一个窗口。这样的窗口被称为父窗口。所有其他窗口直接或间接依赖于它。
-
如果您创建的窗口依赖于另一个窗口,您可以指定它有一个父窗口。
-
这是通过 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); } };
当您运行上述应用程序时,您会看到相同的输出。