MFC入门教程.docx
- 文档编号:12358790
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:54
- 大小:44.61KB
MFC入门教程.docx
《MFC入门教程.docx》由会员分享,可在线阅读,更多相关《MFC入门教程.docx(54页珍藏版)》请在冰豆网上搜索。
MFC入门教程
VisualC++MFC简明教程
第一部分:
MFC导论
VisualC++不仅仅是一个编译器。
它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的C++来开发出专业级的Windows应用程序。
为了能充分利用这些特性,你必须理解C++程序设计语言。
掌握了C++,你就必须掌握Microsoft基本类库(MFC)的层次结构。
该层次结构包容了WindowsAPI中的用户界面部分,并使你能够很容易地以面向对象的方式建立Windows应用程序。
这种层次结构适用于所有版本的Windows并彼此兼容。
你用MFC所建立的代码是完全可移植的。
该教程将向你介绍MFC的基本概念和术语以及事件驱动程序设计方法。
在本节中,你将会输入、编译和运行一个简单的MFC程序。
下一节中将向你详细解释这些代码。
第三部分讨论了MFC控制和如何定制它们。
第四部分将介绍消息映射,你将会处理MFC的事件。
什么是MFC?
如果你要建立一个Windows应用程序,应该如何下手?
好的开端是从设计用户界面开始。
首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象。
Windows用户界面有一些标准的控制,如按钮、菜单、滚动条和列表等,这对那些Windows用户已经是很熟悉了。
要记住的是,作为程序员必须选择一组控制并决定如何把它们安排到屏幕上。
传统上,你需要在纸上做一下用户界面的草图,直到对各元素感到满意为止。
这对于一些比较小的项目,以及一些大项目的早期原型阶段是可以的。
下一步,是要实现代码。
为任何Windows平台建立应用程序时,程序员都有两种选择:
C或C++。
使用C,程序员是在Windows应用程序界面(API)的水平上编写代码。
该界面是由几百个C函数所组成,这些函数在WindowsAPI参考手册中都有介绍。
对于WindowsNT,API被称为“Win32API”,以区别于其用于Windows3.1的16位API。
Microsoft也提供了C++库,它位于任何WindowsAPI之上,能够使程序员的工作更容易。
它就是Microsoft基本类库(MFC),该库的主要优点是效率高。
它减少了大量在建立Windows程序时必须编写的代码。
同时它还提供了所有一般C++编程的优点,例如继承和封装。
MFC是可移植的,例如,在Windows3.1下编写的代码可以很容易地移植到WindowsNT或Windows95上。
因此,MFC很值得推荐的开发Windows应用程序的方法,在本教程自始至终使用的都是MFC。
当是使用MFC时,你编写的代码是用来建立必要的用户界面控制并定制其外观。
同时你还要编写用来响应用户操作这些控制的代码。
例如,如果用户单击一个按钮时,你应该有代码来响应。
这就是事件驱动代码,它构成了所有应用程序。
一旦应用程序正确的响应了所有允许的控制,它的任务也就完成了。
你可以看出,使用MFC进行Windows编程时是一件比较容易的的过程。
本教程的目的是比较详细地教你如何快速建立专业级的应用程序的技术。
VisualC++应用程序开发程序环境特别适合于使用MFC(也有其它开发环境使用MFC,译者注),所以一起学习MFC和VisualC++能够增强你的开发程序的能力。
Windows词汇
在Windows用户界面和软件开发中所要用到的词汇都是基本和唯一的。
对于新接触该环境的用户,下面复习几个定义以便使我们的讨论更加容易。
Windows应用程序使用几个标准的控制:
l 静态文本标签
l 按钮
l 列表框
l 组合框(一种更高级的列表框)
l 单选按钮
l 检查按钮
l 编辑框(单行和多行)
l 滚动条
你可以通过代码或“资源编辑器”来建立这些控制,在资源编辑器中可以建立对话框和这些控制。
在本教程中,我们将使用代码来建立它们。
Windows支持几种类型的应用程序窗口。
一个典型的应用程序应该活动在称为“框架窗口”中。
一个框架窗口是一个全功能的主窗口,用户可以改变尺寸、最小化、最大化等。
Windows也支持两种类型的对话框:
模式和无模式对话框。
模式对话框一旦出现在屏幕上,只有当它退出时,屏幕上该应用程序的其余部分才能响应。
无模式对话框出现在屏幕上时,程序的其余部分也可以作出响应,它就象浮动在上面一样。
最简单的Windows应用程序是使用单文档界面(SDI),只有一个框架窗口。
Windows的钟表、PIF编辑器、记事本等都是SDI应用程序的例子。
Windows也提供了一种称为多文档界面的组织形式,它可用于更复杂的应用程序。
MDI系统允许用户在同一应用程序中同时可以查看多个文档。
例如,一个文本编辑器可以允许用户同时打开多个文本文件。
使用MDI时,应用程序有一个主窗口,在主窗口中有一些子窗口,每个子窗口中各自包含有各自的文档。
在MDI框架中,主窗口有一个主菜单,它对主框架中最顶端窗口有效。
各子窗口都可以缩成图标或展开,MDI主窗口也可以变成桌面上的一个图标。
MDI界面可能会给你一种第二桌面的感觉,它对窗口的管理和删除混乱的窗口有很大的帮助。
你所建立的没一个应用程序都会使用它自己的一套控制、菜单结构以及对话框。
应用程序界面的好坏取决于你如何选择和组织这些界面对象。
VisualC++中的资源编辑器可以使你能容易的建立和定制这些界面对象。
事件驱动软件和词汇
所有基于窗口的GUI都包含相同的基本元素,它们的操作方式都是相同的。
在屏幕上,用户所看到的是一组窗口,每个窗口都包含有控制、图标、对象以及一些处理鼠标和键盘的元素。
从用户角度来看,各系统的界面对象都是相同的:
按钮、滚动条、图标、对话框以及下拉菜单等等。
尽管这些界面元素的“外观和感觉”可能有些不同,但这些界面对象的工作方式都是相同的。
例如,滚动条对于Windows、Mac和Motif可能有些不同,但他们的作用完全是一样的。
从程序员的角度来看,这些系统在概念上是相似的,尽管它们可能有很大的不同。
为了建立GUI程序,程序员第一步要把所有需要的用户界面控制都放到窗口上。
例如,如果程序员要建立一个从摄氏到华氏的转换的简单程序,则程序员所选择的用户界面对象来完成并在屏幕上把结果显示出来。
在这个简单的程序中,程序员可能需要用户在一个可编辑的编辑框中输入温度值,在一个不可编辑的编辑框中显示转换结果,然后让用户可以单击一个标有“退出”的按钮来退出应用程序。
因为是用户来操作应用程序的控制,所以程序必须作出响应。
所做的响应依赖于用户使用鼠标或键盘在不同控制上的操作。
屏幕上的每个用户界面对象对事件的响应是不同的。
例如,如果用户单击退出按钮,则该按钮必须更新屏幕、加亮它自己。
然后程序必须响应退出。
Windows所用的模式也是类似的。
在一个典型的应用程序中,你将建立一个主窗口,并且在其中放置了一些用户界面控制。
这些控制通常被称为子窗口——它们就象一些在主窗口中的更小更特殊的子窗口。
作为程序员,你应该通过函数调用来发送信息操作这些控制、通过把信息发送给你到代码来响应用户的操作。
如果你从未做过事件驱动程序设计,则所有这些对你来说可能是很陌生的。
但是,事件驱动程序设计方式是很容易理解的。
具体的细节对不同的系统可能有些不同,但是其基本概念是类似的。
在一个事件驱动界面中,应用程序会在屏幕上绘制几个界面对象,如按钮、文本区和菜单。
应用程序通常通过一段称为事件循环的的代码来响应用户的操作。
用户可以使用鼠标或键盘来任意操作屏幕上的对象。
例如,用户用鼠标单击一个按钮。
用鼠标单击就称为一个事件。
事件驱动系统把用户的动作如鼠标单击和键盘操作定义为事件,也把系统操作如更新屏幕定义为事件。
在比较低级的编程方法中,如用C直接编写WindowsAPI应用程序,代码量是非常大的,因为你所要照顾的细节太多了。
例如,你用某种类型的结构来接收单击鼠标事件。
你的事件循环中的代码会查看结构中不同域,以确定哪个用户界面对象受到了影响,然后会完成相应的操作。
当屏幕上有很多对象时,应用程序会变得很大。
只是简单地处理哪个对象被单击和对它需要做些什么要花费大量的代码。
幸运的是,你可以在比较高级的方法来进行编程,这就是使用MFC。
在MFC中,几乎所有的低级的细节处理都为你代办了。
如果你把某一用户界面对象放在屏幕上,你只需要两行代码来建立它。
如果用户单击一个按钮,则按钮自己会完成一切必要的操作,从更新屏幕上的外观到调用你程序中的预处理函数。
该函数包含有对该按钮作出相应操作的代码。
MFC为你处理所有的细节:
你建立按钮并告知它特定的处理函数,则当它被按下时,它就会调用相应的函数。
第四部分介绍了怎样使用消息映射来处理事件。
例子
理解一个典型的MFC程序的结构和样式的最好方法是输入一段小程序,然后编译和运行它。
下面的程序是一段简单的“helloworld”程序。
这对很多C程序员都是很熟悉了,让我们看一下如何用MFC方法来实现。
如果你是第一次看到这类程序,也许比较难理解。
这没关系,我们后面会详细介绍。
现在你只要用VisualC++环境中建立、编译和运行它就可以了。
//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);
}
上面的这段程序如果用C来实现,得需要几页的代码。
这个简单的例子做了三件事。
第一,它建立了一个应用程序对象。
你所编写的每个MFC程序都有一个单一的程序对象,它是处理MFC和Windows的初始细节的。
第二,应用程序建立了一个窗口来作为应用程序的主窗口。
最后,在应用程序的窗口中建立了一个静态文本标签,它包含有“helloworld”几个字。
在第二部分中我们会仔细研究这段程序,以理解其结构。
启动VC++,如果你是刚刚安装好,则你会在屏幕上看到一个带有工具栏的空窗口。
如果VC++已经在该机器上使用过了,则所显示的窗口可能有些不同,因为VC++会记忆和自动重新打开上次使用后退出时的项目和文件。
我们需要的是它没有装如任何项目和代码。
如果程序启动后弹出对话框指示不能打开某些文件,你只要单击“No”即可。
在“Window”菜单中选取“CloseAll”选项关闭所有窗口。
在“File”菜单中选取“Close”选项来关闭其它窗口。
现在,你就处于开始状态了。
如果你安装VC++后,第一次运行,则屏幕应如下所示:
如果你以后不希望看到“InfoViewerTopic”窗口,你可以用按钮把它关掉。
如果以后需要的话,你还可以单击工具栏上的“主页”按钮来打开该窗口。
现在一切都正常了。
正如你所看到的,顶部是菜单和几个工具栏。
左边的窗口所显示的是在线帮助内容,你可以双击某项标题来浏览其内容。
在线帮助的内容是十分丰富的。
现在该做什么了?
你所要做的是输入上面的程序,然后便宜并运行它。
开始之前,要检查以下你的硬盘上至少要留有5MB的剩余空间。
建立项目和编译代码
为了在VisualC++中编译代码,你必须要建立一个项目。
为了这么小的程序来建立一个项目可能有点小题大作,但是,在任何实际的程序中,项目的概念是非常有用的。
一个项目主要保存着下面三种不同类型的信息:
1. 它可以记住建立一个可执行程序所需要的所有源程序代码文件。
在这个简单的例子中,文件HELLO.CPP是唯一的源文件,但是在一个大型的应用程序中,为了便于管理和维护,你可以会有许多个不同的源文件。
项目会维护这些不同文件的列表,并当你要建立下一个新的可执行程序时,在必要时编译它们。
2. 它会记住针对你的应用程序所使用的编译器和连接器选项。
例如,它会记住把哪个库连接到了执行程序中,你是否预编译了头文件等等。
3. 它会记住你想要建立的项目类型:
一个控制台应用程序,或一个窗口应用程序等等。
如果你已经对项目文件有所了解,则会很容易明白作为机器产生的项目文件的作用。
现在,我们来建立一个简单的项目,并用它来编译HELLO.CPP。
为此,首先从“File”菜单中选择“New”选项。
在“Projects”标签中,加单击“Win32Application”。
在“Location”域中输入一个合适的路径名或单击“Browse”按钮来选择一个。
在“Projectname”中输入“hello”作为项目名称。
这时候你会看到“hello”也会出现在“Location”域中。
单击“OK”按钮。
VisualC++会建立一个新的称为HELLO的目录,并把所有的项目文件HELLO.OPT、HELLO.NCB、HELLO.DSP和HELLO.DSW都放到该目录中。
如果你退出,以后再重新打开该项目,则可选择HELLO.DSW。
现在,在屏幕的左边,出现了三个标签。
InfoView标签仍然在,又新出现了ClassView和FileView标签。
ClassView标签会把你程序中所有的类都列出来,FileView标签给出了项目中文件的列表。
现在可以输入程序的代码了。
在“File”菜单中选择“New”选项来建立一个编辑窗口。
在出现的对话框中,选择“Files”标签和“TextFile”。
则会出现VisualC++的智能编辑器,你可以用它来输入上面的程序代码。
输入代码时,你会发现编辑器会自动把不同类型的文本变成不同的颜色,如注释、关键字字符串等的颜色都不同。
如果你要改变其颜色或关闭颜色功能,可选择“Tools”菜单中“Options”选项,然后选择“Format”标签和“SourceWindows”选项就可以修改。
输入完代码后,选择“File”菜单中的“Save”选项来保存。
在VisualC++新建立的目录中,把它存成HELLO.CPP文件。
现在选择在“Project”菜单中选择“AddToProject”选项,再选“Files...”。
你会看到一个对话框供你选择要添加的文件。
在本例子中,选择HELLO.CPP文件。
在屏幕的左边,单击FileView标签,并双击标有HELLO的图标。
你会看到名为HELLO.CPP的文件。
单击ClassView标签,并双击文件夹图标,你会看到程序中所有的类。
任何时候你都可以使用FileView来删除项目的文件,你只要单击该文件,然后按键盘上的delete键。
后,此时你必须告诉项目要使用MFC库。
如果你忽略了这一步,则项目在连接时会出错,而出错信息对你毫无帮助。
选择“Project”菜单的“Settings”。
在出现的对话框中选择“General”标签。
在“MicrosoftFoundationClasses”组合框中,选择“UseMFCinaSharedDLL”。
然后关闭对话框。
我们已经建立了项目文件,并调整了设置,你现在可以准备编译HELLO.CPP程序了。
在“Build”菜单中,你会发现有三个不同的编译选项:
1. CompileHELLO.CPP(只有当含有HELLO.CPP的窗口处于激活状态时才可)
2. BuildHELLO.EXE
3. RebuildAll
第一个选项只是编译源文件并形成它们的目标文件。
该选项不能完成连接任务,所以它只对快速编译一些源文件以检查错误有用。
第二个选项编译自上次编译后所修改的所有源文件,并连接形成可执行文件。
第三个选项要重新编译和连接所有的源文件。
我们可以选择“BuildHELLO.EXE”来编译和连接代码。
VisualC++会建立一个名为“Debug”的新子目录,并把HELLO.EXE放在该目录中。
该子目录的文件都是可以再产生的,所以你可以任意删除它们。
如果你发现了编译错误,双击输出窗口中的错误信息。
这时编辑器会把你带到出错的位置处。
检查你的代码是否有问题,如果有,就修改之。
如果你看到大量的连接错误,则可能你在建立项目对话框中所指定的项目类型不对。
你可以把该项目所在的子目录删除,然后再重新按上面的步骤来建立。
为了执行该程序,你可选则“Build”菜单中的“ExecuteHELLO.EXE”选项。
你就可以看到你的第一个MFC程序了--出现一个带有“helloworld”的窗口。
该窗口本身带有:
标题栏、尺寸缩放区、最大和最小按钮等等。
在窗口上,有一个标有“helloworld”。
请注意,该程序是完整的。
你可以移动窗口、缩放窗口、最小化等。
你只使用了很少的代码就完成了一个完整的Window应用程序。
这就是使用MFC的优点。
所有的细节问题都有MFC来处理。
结论
在本讲中,你已经成功地编译和执行了你的第一个MFC程序。
你将来会用类似的步骤来建立的应用程序。
你可以为每个项目建立单独的目录,或建立一个单独的项目文件,然后再添加或删除不同的源文件。
在下一讲中,我们将仔细研究该程序,你会更完整的理解它的结构。
第二部分:
一个简单的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中的不同类就可以建立一个非常漂亮的程序。
该层次结构大约可分为几种不同的类型的类:
l 应用程序框架
l 图形绘制的绘制对象
l 文件服务
l 异常处理
l 结构-List、Array和Map
l Internet服务
l OLE2
l 数据库
l 通用类
在本教程中,我们将集中讨论可视对象。
下面的列表给出了部分类:
l CObject
l CCmdTarget
l CWinThread
l CWinApp
l CWnd
l CFrameWnd
l CDialog
l CView
l CStatic
l CButton
l CListBox
l CComboBox
l CEdit
l CscrollBar
在上面的列表中,有几点需要注意。
第一,MFC中的大部分类都是从基类CObject中继承下来的。
该类包含有大部分MFC类所通用的数据成员和成员函数。
第二,是该列表的简单性。
CWinApp类是在你建立应用程序是要用到的,并且任何程序中都只用一次。
CWnd类汇集了Windows中的所有通用特性、对话框和控制。
CFrameWnd类是从CWnd继承来的,并实现了标准的框架应用程序。
CDialog可分别处理无模式和有模式两种类型的对话框。
CView是用于让用户通过窗口来访问文档。
最后,Windows支持六种控制类型:
静态文本框、可编辑文本框、按钮、滚动条、列表框和组合框(一种扩展的列表框)。
一旦你理解了这些,你也就能更好的理解MFC了。
MFC中的其它类实现了其它特性,如内存管理、文档控制等。
为了建立一个MFC应用程序,你既要会直接使用这些类,而通常你需要从这些类中继承新的类。
在继承的类中,你可以建立新的成员函数,这能更适用你自己的需要。
你在第一讲中的简单例子中已经看到了这种继承过程,下面会详细介绍。
CHelloApp和CHelloWindow都是从已有的MFC类中继承的。
设计一个程序
在讨论代码本身之前,我们需要花些工夫来简单介绍以下MFC中程序设计的过程。
例如,假如你要编一个程序来向用户显示“HelloWorld”信息。
这当然是很简单的,但仍需要一些考虑。
“helloworld”应用程序首先需要在屏幕上建立一个窗口来显示“helloworld”。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFC 入门教程