Visual++MFC.docx
- 文档编号:25761576
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:44
- 大小:37.23KB
Visual++MFC.docx
《Visual++MFC.docx》由会员分享,可在线阅读,更多相关《Visual++MFC.docx(44页珍藏版)》请在冰豆网上搜索。
Visual++MFC
『VisualC++MFC简明教程』
原著:
MarshallBrain编译:
张圣华
Windows词汇
在Windows用户界面和软件开发中所要用到的词汇都是基本和唯一的。
对于新接触该环境的用户,下面复习几个定义以便使我们的讨论更加容易。
Windows应用程序使用几个标准的控制:
静态文本标签
按钮
列表框
组合框(一种更高级的列表框)
单选按钮
检查按钮
编辑框(单行和多行)
滚动条
//hello.cpp
#include
classCHelloApp:
publicCWinApp
{
public:
virtualboolInitInstance();
};
//建立应用程序类的实例
CHelloAppHelloApp;
//说明主窗口类
classCHelloWindow:
publicCframeWnd
{
CStatic*cs;
public:
CHelloWindow();
};
//每当应用程序首次执行时都要调用的初始化函数
boolCHelloApp:
:
InitInstance()
{
m_pMainWnd=newCHelloWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
returnTRUE;
}
//窗口类的构造函数
CHelloWindow:
:
CHelloWindow()
{
//建立窗口本身
Create(NULL,"helloworld",
WS_OVERLAPPEDWINDOW,CRect(0,0,200,200));
//建立静态标签
cs=newCStatic();
cs->Create("helloworld",
WS_CHILD|WS_VISIBLE|SS_CENTER,CRect(50,80,150,150),
this);
}
--------------------------------------------------------------------------------
第二部分:
一个简单的MFC程序
在本将中,我们将一段一段地来研究上一将中提到的MFC应用程序,以便能理解它的结构和概念框架。
我们将先介绍MFC,然后在介绍如何用MFC来建立应用程序。
MFC简介
MFC是一个很大的、扩展了的C++类层次结构,它能使开发Windows应用程序变得更加容易。
MFC是在整个Windows家族中都是兼容的,也就是说,无论是Windows3.x、Windows95还是WindowsNT,所使用的MFC是兼容的。
每当新的Windows版本出现时,MFC也会得到修改以便使旧的编译器和代码能在新的系统中工作。
MFC也回得到扩展,添加新的特性、变得更加容易建立应用程序。
与传统上使用C语言直接访问WindowsAPI相反,使用MFC和C++的优点是MFC已经包含和压缩了所有标准的“样板文件”代码,这些代码是所有用C编写的Windows程序所必需的。
因此用MFC编写的程序要比用C语言编写的程序小得多。
另外,MFC所编写的程序的性能也毫无损失。
必要时,你也可以直接调用标准C函数,因为MFC不修改也不隐藏Windows程序的基本结构。
使用MFC的最大优点是它为你做了所有最难做的事。
MFC中包含了上成千上万行正确、优化和功能强大的Windows代码。
你所调用的很多成员函数完成了你自己可能很难完成的工作。
从这点上将,MFC极大地加快了你的程序开发速度。
MFC是很庞大的。
例如,版本4.0中包含了大约200个不同的类。
万幸的是,你在典型的程序中不需要使用所有的函数。
事实上,你可能只需要使用其中的十多个MFC中的不同类就可以建立一个非常漂亮的程序。
该层次结构大约可分为几种不同的类型的类:
应用程序框架
图形绘制的绘制对象
文件服务
异常处理
结构-List、Array和Map
Internet服务
OLE2
数据库
通用类
在本教程中,我们将集中讨论可视对象。
下面的列表给出了部分类:
CObject
CCmdTarget
CWinThread
CWinApp
CWnd
CFrameWnd
CDialog
CView
CStatic
CButton
CListBox
CComboBox
CEdit
CscrollBar
在上面的列表中,有几点需要注意。
第一,MFC中的大部分类都是从基类CObject中继承下来的。
该类包含有大部分MFC类所通用的数据成员和成员函数。
第二,是该列表的简单性。
CWinApp类是在你建立应用程序是要用到的,并且任何程序中都只用一次。
CWnd类汇集了Windows中的所有通用特性、对话框和控制。
CFrameWnd类是从CWnd继承来的,并实现了标准的框架应用程序。
CDialog可分别处理无模式和有模式两种类型的对话框。
CView是用于让用户通过窗口来访问文档。
最后,Windows支持六种控制类型:
静态文本框、可编辑文本框、按钮、滚动条、列表框和组合框(一种扩展的列表框)。
一旦你理解了这些,你也就能更好的理解MFC了。
MFC中的其它类实现了其它特性,如内存管理、文档控制等。
为了建立一个MFC应用程序,你既要会直接使用这些类,而通常你需要从这些类中继承新的类。
在继承的类中,你可以建立新的成员函数,这能更适用你自己的需要。
你在第一讲中的简单例子中已经看到了这种继承过程,下面会详细介绍。
CHelloApp和CHelloWindow都是从已有的MFC类中继承的。
设计一个程序
在讨论代码本身之前,我们需要花些工夫来简单介绍以下MFC中程序设计的过程。
例如,假如你要编一个程序来向用户显示“HelloWorld”信息。
这当然是很简单的,但仍需要一些考虑。
“helloworld”应用程序首先需要在屏幕上建立一个窗口来显示“helloworld”。
然后需要实际把“helloworld”放到窗口上。
我们需要但个对象来完成这项任务:
一个应用程序对象,用来初始化应用程序并把它挂到Windows上。
该应用程序对象处理所有的低级事件。
一个窗口对象来作为主窗口。
一个静态文本对象,用来显示“helloworld”。
你用MFC所建立的每个程序都会包含头两个对象。
第三个对象是针对该应用程序的。
每个应用程序都会定义它自己的一组用户界面对象,以显示应用程序的输出和收集应用的输入信息。
一旦你完成了界面的设计,并决定实现该界面所需要的控制,你就需要编写代码来在屏幕上建立这些控制。
你还会编写代码来处理用户操作这些控制所产生的信息。
在“helloworld”应用程序中,只有一个控制。
它用来输出“helloworld”。
复杂的程序可能在其主窗口和对话框中需要上百个控制。
应该注意,在应用程序中有两种不同的方法来建立用户控制。
这里所介绍的是用C++代码方式来建立控制。
但是,在比较大的应用程序中,这种方法是不可行的。
因此,在通常情况下要使用资源文件的图形编辑器来建立控制。
这种方法要方便得多。
理解“helloworld”的代码
下面列出了你在上一讲中已经输入、编译和运行的“helloworld”程序的代码。
添加行号是为了讨论方便。
我们来一行行地研究它,你会更好的理解MFC建立应用程序的方式。
如果你还没有编译和运行该代码,应该按上一讲的方法去做。
1//hello.cpp
2#include
3//Declaretheapplicationclass
4classCHelloApp:
publicCWinApp
5{
6public:
7virtualBOOLInitInstance();
8};
9//Createaninstanceoftheapplicationclass
10CHelloAppHelloApp;
11//Declarethemainwindowclass
12classCHelloWindow:
publicCFrameWnd
13{
14CStatic*cs;
15public:
16CHelloWindow();
17};
18//TheInitInstancefunctioniscalledeach
19//timetheapplicationfirstexecutes.
20BOOLCHelloApp:
:
InitInstance()
21{
22m_pMainWnd=newCHelloWindow();
23m_pMainWnd->ShowWindow(m_nCmdShow);
24m_pMainWnd->UpdateWindow();
25returnTRUE;
26}
27//Theconstructorforthewindowclass
28CHelloWindow:
:
CHelloWindow()
29{
30//Createthewindowitself
31Create(NULL,
32"HelloWorld!
",
33WS_OVERLAPPEDWINDOW,
34CRect(0,0,200,200));
35//Createastaticlabel
36cs=newCStatic();
37cs->Create("helloworld",
38WS_CHILD|WS_VISIBLE|SS_CENTER,
39CRect(50,80,150,150),
40this);
41}
你把上面的代码看一遍,以得到一整体印象。
该程序由六小部分组成,每一部分都起到很重要的作用。
首先,该程序包含了头文件afxwin.h(第2行)。
该头文件包含有MFC中所使用的所有的类型、类、函数和变量。
它也包含了其它头文件,如WindowsAPI库等。
第3至8行从MFC说明的标准应用程序类CWinApp继承出了新的应用程序类CHelloApp。
该新类是为了要重载CWinApp中的InitInstance成员函数。
InitInstance是一个应用程序开始执行时要调用的可重载函数。
在第10行中,说明了应用程序作为全局变量的一个事例。
该实例是很重要的,因为它要影响到程序的执行。
当应用程序被装入内存并开始执行时,全局变量的建立会执行CWinApp类的缺省构造函数。
该构造函数会自动调用在18至26行定义的InitInstance函数。
在第11至17中,CHelloWindow类是从MFC中的CFrameWnd类继承来的。
CHelloWindow是作为应用程序在屏幕上的窗口。
建立新的类以便实现构造函数、析构函数和数据成员。
第18至26行实现了InitInstance函数。
该函数产生一个CHelloWindow类的事例,因此会执行第27行至41行中类的构造函数。
它也会把新窗口放到屏幕上。
第27至41实现了窗口的构造函数。
该构造函数实际是建立了窗口,然后在其中建立一个静态文本控制。
要注意的是,在该程序中没有main或WinMain函数,也没有事件循环。
然而我们从上一讲在执行中知道它也处理了事件。
窗口可以最大或最小化、移动窗口等等。
所有这些操作都隐藏在主应用程序类CWinApp中,并且我们不必为它的事件处理而操心,它都是自动执行、在MFC中不可见的。
下一节中,将详细介绍程序的各部分。
你可能不能马上全都理解得很好:
但你最好先读完它以获得第一印象。
在下一讲中,会介绍一些特殊的例子,并偶把各片段组合在一起,有助于你能更好的理解。
程序对象
用MFC建立的每个应用程序都要包括一个单一从CWinApp类继承来的应用程序对象。
该对象必须被说明成全局的(第10行),并且在你的程序中只能出现一次。
从CWinApp类继承的对象主要是处理应用程序的初始化,同时也处理应用程序主事件循环。
CWinApp类有几个数据成员和几个成员函数。
在上面的程序中,我们只重载了一个CWinApp中的虚拟函数InitInstance。
应用程序对象的目的是初始化和控制你的程序。
因为Windows允许同一个应用程序的多个事例在同时执行,因此MFC把初始化过程分成两部分并使用两个函数InitApplication和InitInstance来处理它。
此处,我们只使用了一个InitInstance函数,因为我们的程序很简单。
当每次调用应用程序时都会调用一个新的事例。
第3至8行的代码建立了一个称为CHelloApp的类,它是从CWinApp继承来的。
它包含一个新的InitInstance函数,是从CWinApp中已存在的函数(不做任何事情)重载来的:
3//Declaretheapplicationclass
4classCHelloApp:
publicCWinApp
5{
6public:
7virtualBOOLInitInstance();
8};
在重载的InitInstance函数内部,第18至26行,程序使用CHelloApp的数据成员m_pMainWnd来建立并显示窗口:
18//TheInitInstancefunctioniscalledeach
19//timetheapplicationfirstexecutes.
20BOOLCHelloApp:
:
InitInstance()
21{
22m_pMainWnd=newCHelloWindow();
23m_pMainWnd->ShowWindow(m_nCmdShow);
24m_pMainWnd->UpdateWindow();
25returnTRUE;
26}
InitInstance函数返回TRUE表示初始化已成功的完成。
如果返回了FALSE,则表明应用程序会立即终止。
在下一节中我们将会看到窗口初始化的详细过程。
当应用程序对象在第10行建立时,它的数据成员(从CWinApp继承来的)会自动初始化。
例如,m_pszAppName、m_lpCmdLine和m_nCmdShow都包含有适当的初始化值。
你可参见MFC的帮助文件来获得更详细的信息。
我们将使用这些变量中的一个。
窗口对象
MFC定义了两个类型的窗口:
1)框架窗口,它是一个全功能的窗口,可以改变大小、最小化、最大化等等;2)对话框窗口,它不能改变大小。
框架窗口是典型的主应用程序窗口。
在下面的代码中,从CFrameWnd中继承了一个新的类CHelloWindow:
11//Declarethemainwindowclass
12classCHelloWindow:
publicCFrameWnd
13{
14CStatic*cs;
15public:
16CHelloWindow();
17};
它包括一个新的构造函数,同时还有一个指向程序中所使用的唯一用户界面控制的数据成员。
你多建立的每个应用程序在主窗口中都会有唯一的一组控制。
因此,继承类将有一个重载的构造函数以用来建立主窗口所需要的所有控制。
典型情况下,该类会包含有一个析构函数以便在窗口关闭时来删除他们。
我们这里没有使用析构函数。
在第四讲中,我们将会看到继承窗口类也会说明一个消息处理函数来处理这些控制在响应用户事件所产生的消息。
典型地,一个应用程序将有一个主应用程序窗口。
因此,CHelloApp应用程序类定义了一个名为m_pMainWnd成员变量来指向主窗口。
为了建立该程序的主窗口,InitInstance函数(第18至26行)建立了一个CHelloWindow事例,并使用m_pMainWnd来指向一个新的窗口。
我们的CHelloWindow对象是在第22行建立的:
18//TheInitInstancefunctioniscalledeach
19//timetheapplicationfirstexecutes.
20BOOLCHelloApp:
:
InitInstance()
21{
22m_pMainWnd=newCHelloWindow();
23m_pMainWnd->ShowWindow(m_nCmdShow);
24m_pMainWnd->UpdateWindow();
25returnTRUE;
26}
只建立一个简单的框架窗口是不够的。
还要确保窗口能正确地出现在屏幕上。
首先,代码必须要调用窗口的ShowWindow函数以使窗口出现在屏幕上(第23行)。
其次,程序必须要调用UpdateWindow函数来确保窗口中的每个控制和输出能正确地出现在屏幕上(第24行)。
你可能奇怪,ShowWindow和UpdateWindow函数是在哪儿定义的。
例如,如果你要查看以便了解它们,你可能要查看MFC的帮助文件中的CFrameWnd定义部分。
但是CFrameWnd中并不包含有这些成员函数。
CFrameWnd是从CWnd类继承来的。
你可以查看MFC文档中的CWnd,你会发现它包含有200多个不同的成员函数。
显然,你不能在几分钟内掌握这些函数,但是你可以掌握其中的几个,如ShowWindow和UpdateWindow。
现在让我们花几分钟来看一下MFC帮助文件中的CWnd:
:
ShowWindow函数。
为此,你你可以单击帮助文件中的Search按钮,并输入“ShowWindow”。
找到后,你会注意到,ShowWindow只有一个参数,你可以设置不同的参数值。
我们把它设置成我们程序中CHelloApp的数据成员变量m_nCmdShow(第23行)。
m_nCmdShow变量是用来初始化应用程序启动的窗口显示方式的。
例如,用户可能在程序管理器中启动应用程序,并可通过应用程序属性对话框来告知程序管理器应用程序在启动时要保持最小化状态。
m_nCmdShow变量将被设置成SW_SHOWMINIMIZED,并且应用程序会以图标的形式来启动,也就是说,程序启动后,是一个代表该程序的图标。
m_nCmdShow变量是一种外界与应用程序通讯的方式。
如果你愿意,你可以用不同的m_nCmdShow值来试验ShowWindow的效果。
但要重新编译程序才能看到效果。
第22行是初始化窗口。
它为调用new函数分配内存。
在这一点上,程序在执行时会调用CHelloWindow的构造函数。
该构造函数在每次带类的事例被分配时都要调用。
在窗口构造函数的内部,窗口必须建立它自己。
它是通过调用CFrameWnd的Create成员函数来实现的(第31行):
27//Theconstructorforthewindowclass
28CHelloWindow:
:
CHelloWindow()
29{
30//Createthewindowitself
31Create(NULL,
32"HelloWorld!
",
33WS_OVERLAPPEDWINDOW,
34CRect(0,0,200,200));
建立函数共传递了四个参数。
通过查看MFC文档,你可以了解不同类型。
NULL参数表示使用缺省的类名。
第二个参数为出现在窗口标题栏上的标题。
第三个参数为窗口的类型属性。
该程序使用了正常的、可覆盖类型的窗口。
在下一讲中将详细介绍类型属性。
第四个参数指出窗口应该放在屏幕上的位置和大小,左上角为(0,0),初始化大小为200×200个象素。
如果使用了rectDefault,则Windows会为你自动放置窗口及大小。
因为我们的程序太简单了,所以它只在窗口中建立了一个静态文本控制。
见第35至40行。
下面将详细介绍。
静态文本控制
程序在从CFrameWnd类中继承CHelloWindow类时(第11至17行)时,说明了一个成员类型CStatic及其构造函数。
正如在前面所见到的,CHelloWindow构造函数主要做两件事情。
第一是通过调用Create函数(第31行)来建立应用程序的窗口。
然后分配和建立属于窗口的控制。
在我们的程序中,只使用了一个控制。
在MFC中建一个对象总要经过两步。
第一是为类的事例分配内存,然后是调用构造函数来初始化变量。
下一步,调用Create函数来实际建立屏幕上的对象。
代码使用这两步分配、构造和建立了一个静态文本对象(第36至40行):
27//Theconstructorforthewindowclass
28CHelloWindow:
:
CHelloWindow()
29{
30//Createthewindowitself
31Create(NULL,
32"HelloWorld!
",
33WS_OVERLAPPEDWINDOW,
34CRect(0,0,200,200));
35//Createastaticlabel
36cs=newCStatic();
37cs->Create("helloworld",
38WS_CHILD|WS_VISIBLE|SS_CENTER,
39CRect(50,80,150,150),
40this);
41}
CStatic构造函数是在为其分配内存时调用的,然后就调用了Create函数来建立CStatic控制的窗口。
Create函数所使用的参数与窗口建立函数所使用的参数是类似的(第31行)。
第一个参数指定了控制中所要显示的文本内容。
第二个参数指定了类型属性。
类型属性在下一讲中将详细介绍。
在次我们使用的是子窗口类型(既在别的窗口中显示的窗口),还有它是可见的,还有文本的显示位置是居中的。
第三个参数决定了控制的大小和位置。
第四参数表示该子窗口的父窗口。
已经建立了一个静态控制,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Visual MFC