在本章中,我们将介绍Windows的基础知识.要创建一个程序(也称为应用程序),可以从MFC的CWinApp派生一个类. CWinApp 代表 Windows应用程序的类.
让我们通过创建一个新的Win32项目来看一个简单的例子.
第1步 : 打开Visual studio并单击File → 新的 → 项目菜单选项.
第2步 : 您现在可以看到New Project对话框.
第3步 : 从左侧窗格中,选择Templates → Visual C ++ → Win32.
第4步 : 在中间窗格中,选择Win32 Project.
步骤5 : 在"名称"字段中输入项目名称"MFCWindowDemo",然后单击"确定"继续.您将看到以下对话框.
第6步 : 单击下一步.
步骤7 : 选择上面给出的对话框中显示的选项,然后单击Finish.
第8步 : 创建一个空项目.
步骤9 : 要使其成为MFC项目,请右键单击该项目并选择"属性".
第10步 : 在左侧部分中,单击"配置属性"和"rarr";一般.
步骤11 : 在"项目默认值"部分中选择"在共享DLL中使用MFC"选项,然后单击"确定".
步骤12 : 添加新的源文件.
步骤13 : 右键单击Project并选择Add → 新项目......
步骤14 : 在"模板"部分中,单击"C ++文件(.cpp)".
第15步 : 将Name设置为Example并单击Add.
创建窗口
任何应用程序都有两个主要部分 :
Class
Frame or Window
让我们来吧使用以下步骤创建一个窗口 :
步骤1 : 要创建应用程序,我们需要从MFC的CWinApp派生一个类.
#includeclass 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文件的完整实现.
#includeclass 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样式是控制窗口外观,边框,最小化或最大化状态或其他调整大小等功能的特征.
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步 : 运行此应用程序时,将创建以下窗口.
您现在可以看到最小化,最大化和关闭选项不再出现.
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的大小.
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); } };
当你运行上面的应用程序时,你会看到相同的输出.