Transcript 幻灯片1

4 MFC编程
• 4.1 MFC的概念
• MFC(Microsoft Foundation Class Library)
其实就是一个编程框架,MFC中的各种类
结合起来构成了一个应用程序框架,它的目
的就是让程序员在此基础上来建立Windows
下的应用程序。
• Microsoft Visual C++提供了相应的工具来完
成这个工作:AppWizard可以用来生成初步
的框架文件(代码和资源等);资源编辑
•
•
•
•
•
•
•
器用于帮助直观地设计用户接口; ClassWizard用来协助添加代码到框架文件;最后,
编译,通过类库实现了应用程序特定的逻
辑。
4.1.1 封装
1)对Win32应用程序编程接口的封装
2)对应用程序概念的封装
3)对COM/OLE特性的封装
4)对ODBC功能的封装
4.1.2 继承
4.1.3 构成应用程序的对象之间的关系
• 4.2 用向导创建应用程序
• 在本节中,将使用MFC并且利用Visual C++
中的AppWizard来生成一个最简单的应用程
序。这个程序只是显示一个简单的Windows
窗口。当用AppWizard创建程序时,
AppWizard会为程序中的类和文件命名,如
果应用程序的名字不同,类名和文件名也
不同。
• 下面对创建程序的每一步进行详细的说明。
步骤如下:
• 第1步:启动Visual C++ 6.0,进入Visual
C++ 6.0编程环境。
• 第2步:选择File菜单中的New菜单项,系
统弹出“New”对话框。它包括4个选项卡,
分别用于用于创建新的文件(Files)、工程
(Projects)、工作区(Workspaces)和其
他类型文档(Other Documents),如图4.2
所示。单击“Projects”选项卡,在工程类型
的列表中选择“MFC AppWizard(exe)”
项来生成使用MFC,并且最终形成EXE可
执行文件的工程。在“Location”编辑框中
输入用于存放工程的根目录,也可以单击
右边的 按钮来选择根目录。在“Project
name”编辑框中输入工程的名称hello,单击
“OK”按钮继续。
图4.2 在“New”对话框中设置工程的类型和名称
• 第3步:在MFC AppWizard的第一步将弹出
“MFC AppWizard-Step 1”对话框,如图4.3
所示。此对话框中,将根据具体情况决定
所要生成的应用程序界面形式是单文档
(SDI)、多文档(MDI),还是基于对话
框的。根据不同的要求,AppWizard生成不
同源代码也有所不同。
图4.3 MFC AppWizard第1步设置应用程序界面
• AppWizard可以创建如下3种类型的应用程
序框架:
• Single document 单文档界面(SDI)应用程
序。这类应用程序运行时,只能打开一个
文档,如Windows 2000中的记事本或写字本。
当选择“File”菜单中的“Open”菜单项打开
新的文档时,当前显示的文件在新文件打
开之前将会自动关闭。
• Multiple document 多文档界面(MDI)应
用程序。这类应用程序可以同时打开多个
文档。例如Microsoft Office系列中的Word和
Excel,可以同时处理多个文档。
• Dialog based 基于对话框的应用程序。应用
程序将显示一个简单的对话框来处理用户的
输入,如Windows 2000附件中的代码转换实
用程序。
• 在此例中,选择单文档界面(Single
document)单选按钮。在这组单选按钮的下
方有一个复选框,它用于选择所生成的应用
程序是否支持文档/视图(document/view)结
构。对于有经验的Visual C++程序员,或许
可以不选择这种支持。但是由于本教材主要
面向Visual C++的初学者,所以在本教材的
所有例子中,都要钩选这个复选框。
• 对话框的下部是一个用于选择资源语言的
下拉列表框。系统默认的语言取决于所使
用的Windows操作系统。如果使用的是
Windows简体中文版,则默认语言就是简体
中文。在这里接受缺省设置,单击“Next”
按钮进入AppWizard的下一步。
• 第4步:在AppWizard的第2步将弹出对话框
“MFC AppWizard-Step 2 of 6”,如图4.4所
示。在此对话框中,将决定所要生成的应
用程序是否需要数据库支持,以及数据库
支持的级别。
图4.4 MFC AppWizard第2步设置应用程序界面
• 在该对话框中,关于数据库支持的选项共
有4个,它们的含义如下:
• None 不包含任何数据库支持。如果读者的
应用程序不使用数据库,选用此选项可以
减小程序的大小。
• Header files only 此选项包含最低限度的数
据库支持,当不想从CFormView中派生出自
己的视图类,也不希望在菜单中包含一个
“记录”菜单,可以选用此选项。选用此
项时,我们必须自己创建与数据库相关的
类来访问数据库。
• Database view without file support 此选项将
使应用程序框架包含所有的数据库头文件
和链接库,并且从CFormView中派生出自己
的视图类,同时菜单中将包含一个记录菜
单,此时可以用类CRecordset来更新数据库
中的记录。同时,选择此选项生成的应用
程序不支持文档的串行化。
• Database view with file support 此选项可以
使应用程序和上面的选项一样支持数据库,
同时,程序还支持文档的串行化。
• 在此例中,所要建的应用程序不需要数据
库支持,选中None单选按钮,单击“Next”
按钮进入AppWizard的下一步。
• 第5步:在AppWizard的第3步将弹出“MFC
AppWizard-Step 3 of 6”对话框,如图4.5所
示。在此对话框中,将决定生成的应用程
序中对复合文档的支持。复合文档技术是
指ActiveX和OLE技术,在MFC类库中包含
了大部分的ActiveX控件。
• 在此对话框中,对复合文档的支持共有5个
选项,含义如下:
• None 不包含对ActiveX的支持。
• Container 应用程序包含可以链接或嵌入的
ActiveX对象。例如,要链接或嵌入Word文
档或Excel表单。
图4.5 MFC AppWizard第3步设置应用程序界面
• Mini-server 应用程序仅仅可以创建可以嵌
入到其他应用程序中的文档,但是不能作
为一个单独运行的应用程序。
• Full-server 应用程序可以单独运行,同时也
可以作为一个对象嵌入到其他应用程序中。
• Both container and server 应用程序能够作为
容器包含嵌入或链接的ActiveX对象,同时
也能够作为一个可以嵌入到其他程序中的
对象。
• 如果选择了支持复合文档,则对话框中间
的对复合文件支持的单选按钮将变为可用。
可以选择“Yes,Please”或“No,Thank
you”来决定是否支持复合文件。复合文件包
含一个或多个ActiveX对象,并且以特定方
式存贮,用户可以修改任一个对象而不必
重写整个文件。
• 在对话框下部,是两个其他文档支持的复
选框的选项,含义如下:
• Automation 应用程序支持自动化,可以通
过自动化控制将控制权转交给其他的应用
程序。
• ActiveX Controls 在应用程序中使用ActiveX
控件。
• 在本例中,所要建的应用程序不需要复合文
档支持,因此选中“None”单选按钮;程序
中不需要支持自动化和ActiveX控件,两个复
选框都设为无效。单击“Next”按钮。进行
App-Wizard的下一步。
• 第6步:在AppWizard的第4步将弹出“MFC
AppWizard-Step 4 of 6”对话框,如图4.6所示。
此对话框中,将决定生成的应用程序的界面
外观特征。
图4.6 MFC AppWizard第4步设置应用程序界面
• 对应用程序界面外观的各个选项说明如下:
• Docking toolbar(浮动工具栏) AppWizard
自动为用户将工具栏添加到应用程序中,
工具栏中包含多个按钮用于完成常见的操
作。用户可以根据自己的需要对工具栏进
行添加或删除。
• Initial status bar(初始状态条) AppWizard
自动为用户生成状态栏,在状态栏中可以
显示菜单提示和其他消息。
• Printing and print preview (打印和打印预
览)AppWizard在文件菜单中自动添加打印
和打印预览菜单项。
• Context sensitive Help(上下文敏感帮助)
AppWizard在帮助菜单中自动添加索引和使
用帮助菜单项。如果选择了此项功能,则
AppWizard会在应用程序的各个部分加入大
量的代码。若想使应用程序具有上下文相
关的帮助功能,一定要在此处钩选这个复
选框。否则,以后要想使应用程序具有上
下文相关帮助是非常困难的事情。
• 3D controls(三维控件) 使应用程序的外
观呈三维显示。如果不选择此项,则生成
的应用程序对话框的背景颜色将会是白色,
而且编辑框、复选框和其他的控件都不具
有三维显示效果。
• MAPI(Messaging API,即消息应用程序接
口) 应用程序可以通过MAPI接口来发送
传真、电子邮件或其他信息。
• Windows Sockets(套接口) 应用程序使用
CSocket进行网络通信,通过FTP或者HTTP
协议,应用程序可以直接访问Internet。
• 对工具条的外观设置有两个单选按钮,说
明如下:
• Normal 创建传统风格的工具条,如Microsoft Word中的工具条。
• Internet Explorer ReBars 创建带有Internet
Explorer风格的工具条。
• 对话框底部可以为应用程序设定最近打开
文件的列表个数,缺省设置为4。
• 单击对话框底部的“Advanced”按钮,将弹
出“Advanced Options”对话框,如图4.7所
示。
• 此对话框有两个选项卡,Document
Template Strings(文档模板字符串)和
Windows Styles(窗口风格)两个选项卡。
文档模板字符串选项卡如图4.7所示。在生
成应用程序框架的过程中,AppWizard根据
应用程序的名称来确定生成的类的名称和
提示,可以在这里改变它们。例如,在
图4.7 “Advanced Options”对话框(“Document Template Strings”选项卡)
“Main frame caption”编辑框中,可以定义程
序界面标题栏中显示的标题。还可以通过
定义File extension中的内容,来限制在选择
文件菜单的打开选项时,所要打开的文件
的扩展名。
• 窗口风格选项卡如图4.8所示。通过此选项
卡,可以很方便的对应用程序的窗口风格
进行设置。
图4.8 “Window Styles”选项卡
• 选项卡顶部的“Use split window”复选框的
含义是使用拆分窗口,在程序框架中自动
加入相应的代码。其余的复选框分为两栏,
上面一栏“Main frame styles”是设置主窗体
的风格,下面一栏“MDI child frame styles”
是设置多文档中子窗体的风格。由于在此
例中,在AppWizard的第1步选择应用程序
为SDI,所以此时MDI child frame styles栏为
禁用状态。各个复选框的含义如下:
• Thick frame(粗框架) 使窗体具有一个可
视的有厚度的边界,并且使用户可以用拖
拉的方式来改变窗口的大小。
• Minimize box(最小化框) 窗体具有右上
角的最小化按钮。
• Maximize box(最大化框) 窗体具有右上
角的最大化按钮。
• System menu(系统菜单) 窗体具有左上角
的系统菜单。
• Minimized(最小化) 程序开始运行时,自
动最小化。
• Maximized(最大化) 程序开始运行时,
自动最大化。
• 当设置好所有的选项后,单击“Close”按钮,
返回到AppWizard的第4步。在本例中,全
部接受系统的缺省设置,在“Advanced
Option”对话框中也全部接受缺省值,单击
“Next”按钮继续。
• 第7步:在AppWizard的第5步将弹出“MFC
AppWizard-Step 5 of 6”对话框,如图4.9所
示。此对话框中,将决定生成程序的注释
信息、MFC类库链接方式等问题。
• “What style of project would you like”项目
用于确定工程的风格,它有两个选项,分
别说明如下:
图4.9 MFC AppWizard第5步设置应用程序界面
• MFC Standard 创建标准的MFC的应用程序。
• Windows Explorer 创建Windows资源管理器
风格的应用程序。这种风格的应用程序带
有左右两个面板,左边的面板是一个树形
结构,而右边的面板是一个列表结构。
• “Would you like to generate source file
comments”项目用于确定是否在程序源文件
中插入注释。它有两个选项,说明如下:
• Yes,please 在生成的程序框架的源文件中
加入注释,使程序更加清晰,帮助用户编
写程序。
• No,thank you 不加入注释信息。
• “How would you like to use the MFC library”
项目用于确定MFC类库的链接方式,它也
有两个选项,说明如下:
• As a shared DLL(使用动态链接库) 这样
可以减小应用程序的体积,但是程序不能
单独执行。
• As a statically linked library(使用静态链接
库) 这样应用程序的体积比较大,但是程
序可以单独执行。
• 在本例中,接受系统的默认设置,单击
“Next”按钮继续。
• 第8步:在AppWizard的第6步将弹出“MFC
AppWizard-Step 6 of 6”对话框,如图4.10所
示。在此对话框中,系统给出了将要生成
的4个主要类的信息,包括类名(Class
name)、类定义文件(Header file)、基类
的名称(Base class)和类的实现文件的名
称(Implementation file)。此时,可以对这
些进行修改。如果应用程序中包含视类,
则可以通过改变它的基类来派生自己需要
的子类。缺省的基类是CView,可以选择其
他基类,如CStrollView,CFormView等。
图4.10 MFC AppWizard第6步设置应用程序界面
• 在本例中,采用系统的缺省设置,单击
“Finish”按钮继续。
• 第9步:单击“Finish”按钮后,将弹出工程
信息“New Project Information”,如图4.11
所示。
• 此对话框中显示了所创建的工程的信息。
如果发现有错误,单击“Cancel”按钮返回
到AppWizard的最后一步,再单击“Back”
按钮回到所要更改的步骤进行修改。如果
程序的信息符合要求,单击“OK”按钮生成
应用程序框架。
图4.11 “New Project Information”对话框
• 第10步:现在,AppWizard已经自动生成了
一个最简单的应用程序框架。选择“Build”
菜单中的“Build Hello.exe”菜单项,对工程
进行编译和链接,生成可执行文件。再选
择“Build”菜单中的“Execute Hello.exe”菜
单命令运行程序。将得到一个非常熟悉的
Windows应用程序界面。它拥有标准
Windows的标题栏、菜单、工具栏和状态条。
• 在工具条上移动鼠标,并停留在“新建”
命令按钮上,这时在鼠标的下面将出现此
命令按钮的名称,同时在状态条上将会显
示这个按钮的作用的提示信息“建立新文
档”,如图4.12所示。
图4.12 用AppWizard生成的应用程序框架
• 也可以在窗口上进行最大化、最小化等操
作,或用鼠标拖动来重设窗口的大小。还
可以选择文件菜单下的“打开”菜单项,
屏幕将弹出熟悉的打开对话框,当然无论
选择任何文件都不会有文件被打开。还可
以选择“查看”菜单中的“工具栏”菜单
命令,这将使工具栏隐藏起来,同时“工
具栏”前面的标志也将消失,再次选择此
菜单命令,“工具栏”将会重新出现。对
于状态栏同样可以实现这样的功能。
• 选择帮助菜单中的关于Hello菜单命令,将
弹出由AppWizard自动为我们生成的关于对
话框,如图4.13所示。
图4.13 AppWizard自动生成的“关于”对话框
• 到现在为止,虽然没有写一句程序代码,
但是已经拥有了一个自己的程序,而我们
所做的只是在一系列对话框中进行选择。
虽然这个程序什么也不能做,但是它已经
具备了Windows应用程序的基本特征和功能,
通过编译连接后就可以运行了。
• 4.3 Visual C++ 6.0程序的组成
• 在本节中,将对4.2节中AppWizard自动生
成的应用程序框架进行分析。
• 4.3.1 应用程序的类说明
• AppWizard在生成应用程序时,共派生了5
个类,它们分别是从CWinApp, CDocument,
CView, CMDIFrameWnd,CDialog类对应地
派生出CHelloApp, CHelloDoc, CHelloView,
CMainFrame,CAboutDlg 5个类,这5个类的
实例分别是应用程序对象、文档对象、视
图对象、主框架窗口对象和对话框窗口对
象。对这5个类分别说明如下:
• 1)应用程序类ChelloApp
• CHelloApp是工程Hello的应用程序类。它的
基类是CWinApp。头文件为Hello.h,实现
文件为Hello.cpp。应用程序类控制应用程序
的所有对象,包括文档、视图和边框窗口,
并且完成应用程序的初始化工作和程序退
出时的清除工作。注意:每个基于MFC的
应用程序都必须有一个从CWinApp类派生
的对象,它负责应用程序的初始化、运行
和结束。
• 2)文档类CHelloDoc
• CHelloDoc是工程Hello的文档类。它的基类
是CDocument。头文件为CHelloDoc.h,实
现文件为CHelloDoc.cpp。文档类用于用来
管理数据,数据的变化、存取都是通过文
档实现的。文档类必须通过视图类实现与
用户的交互,视窗口通过文档对象来访问
和更新数据。
• 3)视图类ChelloView
• CHelloView是工程Hello的视图类。它的基
类是CView。头文件为CHelloView.h,实现
文件为CHelloView.cpp。视图和文档联系在
一起,在文档和用户之间起中介作用。视
图类主要负责管理视图窗口,对应的对象
存在于框架窗口的客户区域中,负责显示
用户数据,接受用户对数据的鼠标、键盘
操作并传送给文档类对象。
• 4)主框架窗口类CMainFrame
• CMainFrame是工程Hello的主框架窗口类。
它的基类是CFrameWnd。头文件为
MainFrame.h,实现文件为MainFrame.cpp。
主框架窗口类用于管理主程序的窗口,来
显示标题栏、工具栏、状态栏等,同时还
处理对窗口操作的消息,例如窗口最大化、
最小化、改变窗口大小等一般通用操作。
视图窗口是主框架窗口的子集,对于MDI应
用程序,主框架窗口是所有MDI子窗口的容
器。
• 5)About对话框的对话框类CAboutDlg
• CAboutDlg是工程Hello的对话框类,它是由
MFC类中的CDialog类派生而来的。关于对
话框的内容,将在第7章对话框中详细介绍。
• 在上述的5个类中,文档类、视图类、主框
架窗口类和应用程序类是基本的4个类,它
们通过调用其他类的公共成员函数和发送
消息来进行通信、协同工作。在这4个类中,
应用程序类是程序的基础,而窗口并不是
应用程序的基础。因为一个Windows应用
程序可以不需要任何窗口。
• 6)文档模板
• 文档模板类一般不需要派生。MDI应用程序
使用多文档模板类CMultiDocTemplate;SDI
应用程序使用单文档模板类CSingleDocTemplate。
• 应用程序通过文档模板类对象来管理上述
对象(应用程序对象、文档对象、视图对
象、主框架窗口对象和对话框窗口对象)
的创建。文档类、视图类、主框架窗口类
和应用程序类通过一个文档模板(Template)
联系在一起。它具体实现在函数
InitInstance( )中,该函数是在实现文件
Hello.cpp中定义的。
• 4.3.2 应用程序的文件说明
• 4.3.3 MFC的WinMain( )
• 综上所述,Visual C++为我们所创建的程序
构造了如下的对象:
• 一个应用程序对象。
• 文档对象Cdocument 反映文件的内容。
• 视图对象Cview 文档和用户之间进行交互
的窗口。
• 主框架对象CMainFrame 限定应用程序窗口
范围的对象,其他可显示对象都在此范围
内。
• 文档模板 生成和管理文档。
• 那么,程序是从哪儿开始执行的?回答是:
从WinMain( )开始执行的。