
- MFC 教程
- MFC - 首页
- MFC - 概述
- MFC - 环境设置
- MFC - VC++ 项目
- MFC - 入门
- MFC - Windows 基础
- MFC - 对话框
- MFC - Windows 资源
- MFC - 属性表
- MFC - Windows 布局
- MFC - 控件管理
- MFC - Windows 控件
- MFC - 消息与事件
- MFC - ActiveX 控件
- MFC - 文件系统
- MFC - 标准 I/O
- MFC - 文档视图
- MFC - 字符串
- MFC - Carray 数组
- MFC - 链表
- MFC - 数据库类
- MFC - 序列化
- MFC - 多线程
- MFC - 互联网编程
- MFC - GDI
- MFC - 库
- MFC 有用资源
- MFC - 快速指南
- MFC - 有用资源
- MFC - 讨论
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 - 将名称设置为 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 - 当我们运行上述应用程序时,将创建以下窗口。

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

您现在可以看到最小化、最大化和关闭选项不再出现。
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 构造函数中的前两个参数中指定的。最后两个参数是窗口的大小。

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); } };
运行上述应用程序时,您将看到相同的输出。
