在本章中,无涯教程将介绍Windows的基础知识,若要创建程序(也称为应用程序),请从MFC的CWinApp派生一个类, CWinApp 代表Windows应用程序的 Class。通过创建一个新的Win32项目来研究一个简单的示例。
步骤1 - 打开Visual Studio,然后单击File→New→Project菜单选项。
步骤2 - 现在,您可以看到"New Project"对话框。
步骤3 - 在左侧窗格中,选择 Templates→Visual C ++→Win32。
步骤4 - 在中间窗格中,选择Win32 Project。
步骤5 - 在"name"字段中输入项目名称" MFCWindowDemo",然后单击"OK"继续。您将看到以下对话框。
步骤6 - 单击"Next"。
步骤7 - 选择如上所示对话框中所示的选项,然后单击"Finish"。
步骤8 - 创建了一个空项目(empty project)。
步骤9 - 要使其成为MFC项目,请右键单击该项目,然后选择"Properties"。
步骤10 - 在左侧部分,单击配置 Properties→General。
步骤11 - 在"Project Defaults"部分中选择"Shared DLL中使用MFC"选项,然后单击"OK"。
步骤12 - 添加新的源文件。
步骤13 - 右键单击您的项目,然后选择Add→New Item...
步骤14 - 在"Templates"部分中,单击C ++文件(.cpp)。
步骤15 - 将"Name"设置为"Example",然后单击"Add"。
创建窗口
任何应用程序都有两个主要部分-
- Class
- Frame or Window
让无涯教程使用以下步骤创建一个窗口-
步骤1 - 要创建应用程序,需要从MFC的CWinApp派生一个类。
#include class CExample : public CWinApp { BOOL InitInstance() { return TRUE; } };
步骤2 - 还需要一个框架(frame)/窗口(window)来显示应用程序的内容。
步骤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 - 运行上述应用程序时,将创建以下窗口。
Windows Style
Windows样式是控制诸如窗口外观,边框,最小化或最大化状态或其他调整大小状态等功能的特征。
以下是创建窗口时可以使用的样式列表。Sr.No. | Style & 描述 |
---|---|
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_CHILD样式一起使用。 |
7 |
WS_DISABLED 创建一个最初被禁用的窗口。 |
8 |
WS_DLGFRAME 创建一个带有双边框但没有标题的窗口。 |
9 |
WS_GROUP 指定一组控件中的第一个控件,用户可以在其中使用箭头键从一个控件移到下一个控件。第一个控件之后,所有以WS_GROUP样式FALSE定义的控件都属于同一组。 |
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样式创建一个重叠窗口。 |
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 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的大小。
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); } };
当您运行上述应用程序时,您将看到相同的输出。