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( )开始执行的。