版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 l 应用程序框架应用程序框架 l 应用程序向导应用程序向导 l 应用程序向导生成的文件应用程序向导生成的文件 l ClassWizard类向导类向导 l 程序调试程序调试 通过本章的学习我们可以真通过本章的学习我们可以真 正利用正利用Visual C+Visual C+创建一个创建一个 简单的简单的 MFC MFC 应用程序。应用程序。 同一类型应用程序的结构大致相同,并有很多相同的源代同一类型应用程序的结构大致相同,并有很多相同的源代 码,因此可以通过一个应用程序框架码,因此可以通过一个应用程序框架AFX(Application FrameWorks)编写同一类型应用程序的通用源代码。编写
2、同一类型应用程序的通用源代码。 何谓应用程序框架?何谓应用程序框架? l与其它可视化开发工具一样,与其它可视化开发工具一样,Visual C+提供了创建应用程序提供了创建应用程序 框架的向导框架的向导AppWizard和相关的开发工具。和相关的开发工具。 l在可视化开发环境下,生成一个应用程序要做的工作主要包括在可视化开发环境下,生成一个应用程序要做的工作主要包括 编写源代码、添加资源和设置编译方式。向导实质上是一个编写源代码、添加资源和设置编译方式。向导实质上是一个源源 代码生成器代码生成器,利用,利用应用程序向导应用程序向导可以快速创建各种风格的可以快速创建各种风格的应用应用 程序框架程序
3、框架,自动生成程序通用的源代码,这样大大减轻了手工,自动生成程序通用的源代码,这样大大减轻了手工 编写代码的工作量。编写代码的工作量。 l即使不熟悉即使不熟悉Visual C+编程,也可以利用它的编程,也可以利用它的应用程序向导应用程序向导一一 个简单的应用程序。个简单的应用程序。 创建一个应用程序,首先要创建一个创建一个应用程序,首先要创建一个项目项目。项目用于管理组成应。项目用于管理组成应 用程序的所有元素,并由它生成应用程序。用程序的所有元素,并由它生成应用程序。 Visual C+集成开发环境包含了创建各种类型应用程序的向导,集成开发环境包含了创建各种类型应用程序的向导, 执行执行Fi
4、le菜单中的菜单中的New命令即可看到向导类型。命令即可看到向导类型。 Visual C+集成开发环境中主要向导类型:集成开发环境中主要向导类型: lDatebase Project:创建数据库项目创建数据库项目 lMFC ActiveX Control Wizard:创建基于创建基于MFC的的ActiveX控件控件 lMFC AppWizarddll:创建基于创建基于MFC的动态链接库的动态链接库 lMFC AppWizardexe:创建基于创建基于MFC的应用程序(最常用)的应用程序(最常用) lNew Database Wizard:在在SQL服务器上创建一个服务器上创建一个SQL Se
5、rver数据库数据库 lWin32 Application:创建创建Win32应用程序,可不使用应用程序,可不使用MFC,采用采用API方法方法 编程编程 lWin32 Console Application:创建创建DOS下的下的Win32控制台应用程序,采用控制台应用程序,采用 C+或或C语言进行编程语言进行编程 lWin32 Dynamic-link Library:创建创建Win32动态链接库,采用动态链接库,采用API方法方法 lWin32 Static Library:创建创建Win32静态链接库,采用静态链接库,采用API方法方法 引入应用程序向导的目的:引入应用程序向导的目的:
6、 区别于区别于DOS程序,即使一个简单的程序,即使一个简单的Windows程序,它也必程序,它也必 须显示一个程序运行窗口,需要编写复杂的程序代码。而同一须显示一个程序运行窗口,需要编写复杂的程序代码。而同一 类型应用程序的框架窗口风格是相同的,如相同的菜单栏、工类型应用程序的框架窗口风格是相同的,如相同的菜单栏、工 具栏、状态栏和用户区。并且,基本菜单命令的功能也是一样具栏、状态栏和用户区。并且,基本菜单命令的功能也是一样 的,如相同的文件操作和编辑命令。所以,同一类型应用程序的,如相同的文件操作和编辑命令。所以,同一类型应用程序 建立建立框架窗口框架窗口的基本代码都是一样的,尽管有些参数不
7、尽相同。的基本代码都是一样的,尽管有些参数不尽相同。 为了避免程序员重复编写这些代码,一般的可视化软件开发工为了避免程序员重复编写这些代码,一般的可视化软件开发工 具都提供了创建具都提供了创建Windows应用程序框架的向导。应用程序框架的向导。 lMFC AppWizardexe是创建基于是创建基于MFC的的Windows应用程序的应用程序的 向导。当利用向导。当利用MFC AppWizardexe创建一个项目时,它能够创建一个项目时,它能够 自动生成一个自动生成一个MFC应用程序的框架。应用程序的框架。 l即使不添加任何代码,当执行编译、链接命令后,即使不添加任何代码,当执行编译、链接命令
8、后,Visual C+ IDE 将生成一个将生成一个Windows界面风格的应用程序。界面风格的应用程序。 lMFC应用程序框架应用程序框架将那些每个应用程序都共同需要使用的代将那些每个应用程序都共同需要使用的代 码封装起来,如完成默认的程序初始化功能、建立应用程序码封装起来,如完成默认的程序初始化功能、建立应用程序 界面和处理基本的界面和处理基本的Windows消息,使程序员不必做这些重复的消息,使程序员不必做这些重复的 工作,把精力放在编写实质性的代码上。工作,把精力放在编写实质性的代码上。 lMFC AppWizardexe向导提供了一系列选项,程序员通过选向导提供了一系列选项,程序员通
9、过选 择不同的选项,可以创建不同类型和风格的择不同的选项,可以创建不同类型和风格的MFC应用程序,应用程序, 并可定制不同的程序界面窗口。例如,单文档、多文档、基并可定制不同的程序界面窗口。例如,单文档、多文档、基 于对话框的程序,是否支持数据库操作、是否可以使用于对话框的程序,是否支持数据库操作、是否可以使用 ActiveX控件以及是否具有联机帮助等。控件以及是否具有联机帮助等。 l在在Visual C+ 中执行中执行File| |New命令,出现命令,出现New对话框。对话框。 l确认确认New对话框的当前页面为对话框的当前页面为Project,在左栏的项目类型列表框在左栏的项目类型列表框
10、 中选择中选择MFC AppWizardexe项,在项,在Project Name框输入要创建项框输入要创建项 目的名称目的名称。在在Location栏中输入项目所在的目录,可单击右侧栏中输入项目所在的目录,可单击右侧“” 浏览按钮来对默认的目录进行修改。向导将在该目录下存放项目浏览按钮来对默认的目录进行修改。向导将在该目录下存放项目 的所有文件。单击的所有文件。单击OK按钮出现按钮出现MFC AppWizard-Step1对话框。对话框。 在在MFC AppWizard-Step1对话框中选择应用程序的类型。对话框中选择应用程序的类型。 lSingle document:单文档界面应用程序,
11、程序运行后出现标准的单文档界面应用程序,程序运行后出现标准的 Windows界面,它由框架(包括菜单栏、工具栏和状态栏)和用界面,它由框架(包括菜单栏、工具栏和状态栏)和用 户区组成。并且程序运行后一次只能打开一个文档,如户区组成。并且程序运行后一次只能打开一个文档,如Windows 自带的记事本自带的记事本Notepad。 lMultiple documents:多文档界面应用程序,程序运行后出现标多文档界面应用程序,程序运行后出现标 准的准的Windows界面,并且可以同时打开多个文档,如界面,并且可以同时打开多个文档,如Word。 lDialog based:基于对话框的应用程序,程序运
12、行后首先出现一基于对话框的应用程序,程序运行后首先出现一 个对话框界面,如计算器个对话框界面,如计算器Calculator。 lNone:向导创建的应用程序不包括对数据库的操作功能,但以后可向导创建的应用程序不包括对数据库的操作功能,但以后可 以手工添加对数据库的操作代码(以手工添加对数据库的操作代码(默认项默认项)。)。 lHeader files only:提供了最简单的数据库支持,仅在项目的提供了最简单的数据库支持,仅在项目的 stdAfx.h文件中使用文件中使用#include指令包含指令包含afxdb.h和和afxdao.h两个用于定两个用于定 义数据库类的头文件,但并不生成与数据库
13、相关的类,用户需要时义数据库类的头文件,但并不生成与数据库相关的类,用户需要时 可以自己生成。可以自己生成。 lDatabase view without file support:包含了所有的数据库头文件,包含了所有的数据库头文件, 并生成了相关的数据库类和视图类,但不支持文档的序列化,向导并生成了相关的数据库类和视图类,但不支持文档的序列化,向导 创建的应用程序的创建的应用程序的File主菜单中将不包含有关文件操作的菜单命令主菜单中将不包含有关文件操作的菜单命令 项。项。 l Database view with file support:包含了所有的数据库头文件,生包含了所有的数据库头文
14、件,生 成了相关的数据库类和视图类,支持文档的序列化。成了相关的数据库类和视图类,支持文档的序列化。 lNone:应用程序不支持任何复合文档(应用程序不支持任何复合文档(默认项默认项)。)。 lContainer:应用程序作为复合文档容器,能容纳所嵌入或链接的应用程序作为复合文档容器,能容纳所嵌入或链接的 复合文档对象。复合文档对象。 lMini-server:微型复合文档服务器,应用程序可以创建和管理复微型复合文档服务器,应用程序可以创建和管理复 合文档对象,但对于它所创建的复合文档对象,集成应用程序可合文档对象,但对于它所创建的复合文档对象,集成应用程序可 以嵌入,但不能链接。微型服务器不
15、能作为一个单独的程序运行,以嵌入,但不能链接。微型服务器不能作为一个单独的程序运行, 而只能由集成应用程序来启动。而只能由集成应用程序来启动。 lFull-server:完全复合文档服务器,除了具备上面微型服务器的功完全复合文档服务器,除了具备上面微型服务器的功 能外,应用程序支持链接式对象,并可作为一个单独的程序运行。能外,应用程序支持链接式对象,并可作为一个单独的程序运行。 lBoth container and server:应用程序既可作为一个复合文档容器,应用程序既可作为一个复合文档容器, 又可作为一个可单独运行的复合文档服务器。又可作为一个可单独运行的复合文档服务器。 lDocki
16、ng toolbar:应用程序具有标准的工具栏(应用程序具有标准的工具栏(默认项默认项) lInitial status bar:应用程序具有标准的状态栏(应用程序具有标准的状态栏(默认项默认项) lPrinting and print preview:应用程序支持打印和打印预览功能应用程序支持打印和打印预览功能 (默认项默认项) lContext-sensitive Help:应用程序具有上下文相关帮助功能应用程序具有上下文相关帮助功能 l3D controls:应用程序界面具有三维外观(应用程序界面具有三维外观(默认项默认项) lMAPI:应用程序具有发送电子邮件的功能:应用程序具有发送电
17、子邮件的功能 lWindows Sockets:应用程序能使用套接字,支持:应用程序能使用套接字,支持TCP/IP协议协议 lNormal:应用程序采用传统风格的工具栏(应用程序采用传统风格的工具栏(默认项默认项) lInternet Explorer ReBars:应用程序采用应用程序采用IE风格的工具栏风格的工具栏 lHow many files would you like on your recent file list:在在File主菜单主菜单 可列出文档的最多个数可列出文档的最多个数 lAdvanced按钮:进行更高一级的设置,如修改文件名或扩展名,按钮:进行更高一级的设置,如修改
18、文件名或扩展名, 调整程序用户界面窗口的样式调整程序用户界面窗口的样式 lMFC Standard:应用程序采用应用程序采用MFC标准风格标准风格(默认项默认项) lWindows Explorer:应用程序采用应用程序采用Windows资源管理器风格资源管理器风格 l选择向导是否为源代码生成选择向导是否为源代码生成注释注释 l设置设置MFC库与应用程序的库与应用程序的链接方式链接方式: (1) As a shared DLL:采用采用共享动态链接库共享动态链接库的方式的方式(默认项默认项) ,即,即 在程序运行时才调用在程序运行时才调用MFC库。采用此方式可减少应用程序的代码库。采用此方式可
19、减少应用程序的代码 长度。长度。 (2) As a statically linked library:采用采用静态链接库静态链接库的方式,即在的方式,即在 编译时把编译时把MFC库与应用程序相链接。采用此方式能提高运行速度,库与应用程序相链接。采用此方式能提高运行速度, 且不用考虑程序最终运行环境中是否安装了且不用考虑程序最终运行环境中是否安装了MFC库。库。 在在MFC AppWizard-Step 6 of 6,列出了向导将创建的类,用户可,列出了向导将创建的类,用户可 以修改一些类默认的类名和对应的头文件名、实现文件名。对某些类以修改一些类默认的类名和对应的头文件名、实现文件名。对某些
20、类 还可以选择不同的还可以选择不同的基类基类。 在在New Project Information对话框,根据用户在前面各步所做的对话框,根据用户在前面各步所做的 选择列出将要创建的应用程序的有关信息,如应用程序的类型、创建选择列出将要创建的应用程序的有关信息,如应用程序的类型、创建 的类和文件名、应用程序的特征以及项目所在的目录。若要修改这些的类和文件名、应用程序的特征以及项目所在的目录。若要修改这些 内容,可单击内容,可单击Cancel按钮返回到前一个对话框。单击按钮返回到前一个对话框。单击OK按钮,按钮,MFC AppWizardexe向导将开始创建应用程序框架。向导将开始创建应用程序框
21、架。 当应用程序框架创建成功后,当应用程序框架创建成功后,Developer Studio将装入应用程序项将装入应用程序项 目,并在项目工作区窗口打开这个项目。值得说明的是,若想在同一目,并在项目工作区窗口打开这个项目。值得说明的是,若想在同一 个目录下重新创建一个同名的项目,必须首先将原来的项目删除或移个目录下重新创建一个同名的项目,必须首先将原来的项目删除或移 走。走。 利用利用MFC AppWizardexe向导创建应用程序向导创建应用程序Mysdi的框架后,用的框架后,用 户无需添加任何代码,就可以对程序进行编译、链接,生成一个应用户无需添加任何代码,就可以对程序进行编译、链接,生成一
22、个应用 程序。但一般情况下,用户应根据程序具体功能需要,利用程序。但一般情况下,用户应根据程序具体功能需要,利用Developer Studio中的集成工具向应用程序框架添加具体的代码。中的集成工具向应用程序框架添加具体的代码。 void CMysdiView:OnDraw(CDC* pDC) CMysdiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here pDC-TextOut(100, 100, “这是一个单文档程序!这是一个单文档程序!”); / 在坐标在坐标(
23、100, 100)处显示文本串处显示文本串 执行执行Build(F7)命令命令编译链接程序,程序运行后将在程序视编译链接程序,程序运行后将在程序视 图区域显示文本串。图区域显示文本串。 P140P140表表4-14-1 例例4_2:编写一个基于对话框的应用程序:编写一个基于对话框的应用程序MyDialog,程序运行后程序运行后 显示一个对话框。显示一个对话框。 编程说明与实现:编程说明与实现: 1. 执行执行File|New命令,在命令,在New对话框中选择对话框中选择MFC AppWizardexe项,输入程序名项,输入程序名MyDialog。单击单击OK按钮,出现按钮,出现 MFC App
24、Wizard-Step 1。 2. 在在MFC AppWizard-Step 1中选择中选择Dialog Based选项,单选项,单 击击Next按钮,出现按钮,出现MFC AppWizard-Step 2 of 4。 3. 在在MFC AppWizard-Step 2 of 4中设置应用程序界面特征。中设置应用程序界面特征。 4. . 创建对话框应用程序后续的步骤与创建单文档或多文档创建对话框应用程序后续的步骤与创建单文档或多文档 应用程序的应用程序的Step 5和和Step 6 相同。相同。 利用利用Visual C+编写编写Windows应用程序可以采取几种不同应用程序可以采取几种不同
25、的途径:的途径: l 利用利用 Win32 应用程序接口应用程序接口 API( Application Programming Interface)提供的函数,用提供的函数,用C或或C+语言编写程序。语言编写程序。 l 由于由于 MFC 通过类对通过类对API的绝大部分功能进行了封装,可以的绝大部分功能进行了封装,可以 利用利用 MFC ,用,用 C+ 语言编写程序。语言编写程序。 l利用利用 MFC 和和 MFC AppWizardexe,首先利用首先利用 MFC AppWizardexe 应用程序向导生成基本的应用程序框架,然应用程序向导生成基本的应用程序框架,然 后按照后按照 MFC 机
26、制和原理向框架添加具体的应用代码。机制和原理向框架添加具体的应用代码。 l根据应用程序特性在根据应用程序特性在MFC AppWizardexe应用程序向导各应用程序向导各 步骤对话框中进行选择,创建一个应用程序的框架。步骤对话框中进行选择,创建一个应用程序的框架。 l利用利用资源编辑器资源编辑器为程序编辑或添加资源,如编辑菜单、添为程序编辑或添加资源,如编辑菜单、添 加对话框等。加对话框等。 l利用利用ClassWizard类向导或手工添加类、成员变量和成员函类向导或手工添加类、成员变量和成员函 数的声明。数的声明。 l根据需要编写具体的函数代码。根据需要编写具体的函数代码。 l编译、链接程序
27、。如果程序有语法错误,需要修改源程序。编译、链接程序。如果程序有语法错误,需要修改源程序。 直到没有编译、链接错误,才能得到可执行程序。直到没有编译、链接错误,才能得到可执行程序。 l测试应用程序各项功能,如果程序没有实现程序设计所要测试应用程序各项功能,如果程序没有实现程序设计所要 求的功能,启动求的功能,启动Debug调试器进行调试,找出并修改程序设调试器进行调试,找出并修改程序设 计中的逻辑错误。计中的逻辑错误。 ClassWizard类向导:类向导: Visual C+ IDE为为MFC提供了大量的支持工具,除了提供了大量的支持工具,除了MFC AppWizardexe向导,还提供了向
28、导,还提供了ClassWizard类向导,利用它程类向导,利用它程 序员可以方便地增加或删除对某个消息的处理。序员可以方便地增加或删除对某个消息的处理。 资源编辑器:资源编辑器: 为程序添加具体的代码时还经常要用到为程序添加具体的代码时还经常要用到资源编辑器资源编辑器。 下图形象地说明了编写一个下图形象地说明了编写一个MFC应用程序的流程、所用到应用程序的流程、所用到 的工具及主要生成的文件。的工具及主要生成的文件。 CLWCLW 编程时,除了编辑现有的资源,有时需要向项目添加新的编程时,除了编辑现有的资源,有时需要向项目添加新的 资源,这时可以利用资源,这时可以利用Insert菜单创建一个新
29、的资源。菜单创建一个新的资源。 打开打开Insert菜单,选择菜单,选择Resource菜单项,出现菜单项,出现Insert Resource对话框,如下图所示,在对话框,如下图所示,在Resource Type框中选择一个框中选择一个 资源类型,单击资源类型,单击New按钮即可向项目添加一个资源。按钮即可向项目添加一个资源。 MFC类库将所有图形用户界面的元素如窗口、菜单和按类库将所有图形用户界面的元素如窗口、菜单和按 钮等都钮等都以类的形式进行了封装以类的形式进行了封装,编程时需要利用,编程时需要利用C+类的继类的继 承性从承性从MFC类中派生出自己的类,实现标准类中派生出自己的类,实现标
30、准Windows应用程应用程 序的功能。序的功能。 MFC AppWizardexe向导对向导对Windows应用程序进行了应用程序进行了 分解,并利用分解,并利用MFC的派生类对应用程序重新进行了组装,同的派生类对应用程序重新进行了组装,同 时还规定了应用程序中所用到的时还规定了应用程序中所用到的MFC派生类对象之间的派生类对象之间的相互相互 联系联系,这就是向导生成的,这就是向导生成的MFC应用程序框架应用程序框架。MFC应用程序应用程序 框架实质上是一个标准的框架实质上是一个标准的Windows应用程序,它具有标准的应用程序,它具有标准的 窗口、菜单栏和工具栏。窗口、菜单栏和工具栏。 为
31、了生成一个可执行程序,为了生成一个可执行程序,MFC AppWizardexe向导必向导必 须首先创建一个项目,并为项目生成一系列初始文件,如须首先创建一个项目,并为项目生成一系列初始文件,如C+ 头文件头文件、C+源文件源文件、资源文件资源文件和和项目文件项目文件,其中的,其中的C+文件文件 都是以都是以MFC派生类为单元来组织的。派生类为单元来组织的。 Visual C+中的文件类型很多,根据项目类型不同而产生中的文件类型很多,根据项目类型不同而产生 不同类型的文件。下面列出了不同类型的文件。下面列出了MFC AppWizardexe应用程序应用程序 向导生成的文件类型。当进行编辑、编译和
32、链接时,还要生成向导生成的文件类型。当进行编辑、编译和链接时,还要生成 一些临时文件。一些临时文件。 后缀后缀类型类型说明说明 dsw工作区文件工作区文件将项目的详细情况组合到工作区中将项目的详细情况组合到工作区中 dsp项目文件项目文件存储项目的详细情况并替代存储项目的详细情况并替代mak文件文件 hC+头文件头文件存储类的定义代码存储类的定义代码 cppC+源文件源文件存储类的成员函数的实现代码存储类的成员函数的实现代码 rc资源脚本文件资源脚本文件存储菜单、工具栏和对话框等资源存储菜单、工具栏和对话框等资源 rc2资源文件资源文件用来将资源包含到项目中用来将资源包含到项目中 ico图标文
33、件图标文件存储应用程序图标存储应用程序图标 bmp位图文件位图文件存储位图存储位图 clw类向导文件类向导文件存储存储ClassWizard类向导使用的类信息类向导使用的类信息 ncb没有编译的浏览文件没有编译的浏览文件保留保留ClassView和和ClassWizard使用的详细情况使用的详细情况 opt可选项文件可选项文件存储自定义的存储自定义的WorkSpace工作区中的显示情况工作区中的显示情况 一般而言,一般而言,C+中的一个类由中的一个类由头文件头文件h和和源文件源文件cpp两类文件支持。两类文件支持。 头文件用于定义类,包括指明派生关系、声明成员变量和函数。头文件用于定义类,包括
34、指明派生关系、声明成员变量和函数。 源文件用于实现类,主要定义成员函数的实现代码和消息映射。源文件用于实现类,主要定义成员函数的实现代码和消息映射。 例如,应用程序视图类例如,应用程序视图类CMysdiView的两个支持文件是的两个支持文件是MysdiView.h 和和MysdiView.cpp。 l MFC AppWizardexe向导为一般的向导为一般的SDI应用程序生成了五个类,应用程序生成了五个类, 这些类都是这些类都是MFC类的派生类。这里的类的派生类。这里的“一般的一般的SDI应用程序应用程序”是指向是指向 导每一步都采用默认选项,如不支持数据库和导每一步都采用默认选项,如不支持数
35、据库和OLE对象等。对象等。 l 一般应用程序框架中所有类的名字由一般应用程序框架中所有类的名字由MFC AppWizardexe向导根向导根 据一定的规则自动命名,但用户可以在向导的第据一定的规则自动命名,但用户可以在向导的第6步改变类名和有关步改变类名和有关 类的文件名。应用程序框架中类(框架窗口类例外)的命名规则一般类的文件名。应用程序框架中类(框架窗口类例外)的命名规则一般 遵照如下要求:遵照如下要求: Class Name = C + ProjectName + ClassType 除了除了CAboutDlg类,应用程序向导为框架窗口类、文档类、类,应用程序向导为框架窗口类、文档类、
36、 视图类和应用程序类等视图类和应用程序类等4个类生成了头文件。个类生成了头文件。 注注:在定义类的头文件中的开始位置(类的正式定义前):在定义类的头文件中的开始位置(类的正式定义前) 有一段预处理命令代码,这些代码是为有一段预处理命令代码,这些代码是为Developer Studio自身自身 准备的,如用于保证头文件在编译时仅被编译一次。准备的,如用于保证头文件在编译时仅被编译一次。 Developer Studio中的资源编辑器、中的资源编辑器、ClassWizard类向导和编译类向导和编译 器都可能用到这些代码。这些代码如下形式所示:器都可能用到这些代码。这些代码如下形式所示: #if !
37、defined (AFX_MAINFRM_H_4A1FE89D_3AF4_4C81_8341_E B0D3FE4E5D1_INCLUDED_) #define AFX_MAINFRM_H_4A1FE89D_3AF4_4C81_8341_EB0D3 FE4E5D1_INCLUDED_ #if _MSC_VER 1000 #pragma once #endif / _MSC_VER 1000 l向导为项目向导为项目Mysdi生成了框架窗口类的头文件生成了框架窗口类的头文件MainFrm.h, 该头文件用于定义框架窗口类该头文件用于定义框架窗口类CMainFrame。不同的不同的SDI应用应用 程序
38、,其框架窗口类名和文件名是统一的。程序,其框架窗口类名和文件名是统一的。 lCMainFrame类是类是MFC的的CFrameWnd类的派生类,它类的派生类,它主要主要 负责创建标题栏、菜单栏、工具栏和状态栏负责创建标题栏、菜单栏、工具栏和状态栏。 lCMainFrame类中声明了框架窗口中的工具栏类中声明了框架窗口中的工具栏m_wndToolBar、 状态栏状态栏m_wndStatusBar两个成员变量和四个成员函数。两个成员变量和四个成员函数。 向导为项目向导为项目Mysdi生成了文档类的头文件生成了文档类的头文件MysdiDoc.h,该该 头文件用于定义文档类头文件用于定义文档类CMys
39、diDoc。CMysdiDoc类是类是MFC的的 CDocument类的派生类,它类的派生类,它主要负责应用程序数据的保存和装主要负责应用程序数据的保存和装 载,实现文档的序列化功能载,实现文档的序列化功能。 l向导为项目向导为项目Mysdi生成了视图类的头文件生成了视图类的头文件MysdiView.h,该头该头 文件用于定义视图类文件用于定义视图类CMysdiView。视图类用于处理客户区窗视图类用于处理客户区窗 口,它是框架窗口中的一个子窗口。口,它是框架窗口中的一个子窗口。 lCMysdiView类是类是MFC的的CView类的派生类,它类的派生类,它主要负责客主要负责客 户区文档数据的
40、显示,以及如何进行人机交互户区文档数据的显示,以及如何进行人机交互。 向导为项目向导为项目Mysdi生成了应用程序类的头文件生成了应用程序类的头文件Mysdi.h,该该 头文件用于定义应用程序类头文件用于定义应用程序类CMysdiApp。CMysdiApp类是类是 MFC的的CWinApp类的派生类,它类的派生类,它主要负责完成应用程序的初主要负责完成应用程序的初 始化、程序的启动和程序运行结束时的清理工作始化、程序的启动和程序运行结束时的清理工作。 l在项目中,资源通过资源标识符加以区别,通常将一个项目在项目中,资源通过资源标识符加以区别,通常将一个项目 中所有的资源标识符放在头文件中所有的
41、资源标识符放在头文件Resource.h中定义。中定义。 l向导为项目向导为项目Mysdi生成了资源头文件生成了资源头文件Resource.h,该文件该文件用于用于 定义项目中所有的资源标识符,给资源定义项目中所有的资源标识符,给资源ID分配一个整数值分配一个整数值。 l标识符的命名有一定的规则,如标识符的命名有一定的规则,如IDR_MAINFRAME代表有代表有 关主框架的资源,包括主菜单、工具栏及图标等。标识符以关主框架的资源,包括主菜单、工具栏及图标等。标识符以 不同的前缀开始,见下表。不同的前缀开始,见下表。 IDR_主菜单、工具栏、应用程序图标和快捷键表主菜单、工具栏、应用程序图标和
42、快捷键表 IDD_对话框对话框 IDC_控件和光标控件和光标 IDS_字符串字符串 IDP_提示信息对话框的字符串提示信息对话框的字符串 ID_菜单命令项菜单命令项 l向导为项目向导为项目Mysdi生成了标准包含头文件生成了标准包含头文件StdAfx.h,该文件该文件用用 于包含一般情况下要用到且不会被修改的头文件于包含一般情况下要用到且不会被修改的头文件,如,如MFC类类 的声明文件的声明文件afxwin.h、使用工具栏和状态栏的文件使用工具栏和状态栏的文件afxext.h, 这些头文件一般都存放在路径这些头文件一般都存放在路径“Microsoft Visual StudioVC98MFCI
43、nclude”下。下。 lStdAfx.h文件和文件和StdAfx.cpp文件用来生成预编译文件。文件用来生成预编译文件。 l对应于一个头文件中定义的类,都有一个类的对应于一个头文件中定义的类,都有一个类的实现源文件实现源文件。 在实现文件中主要定义在头文件中声明的在实现文件中主要定义在头文件中声明的成员函数的实现代成员函数的实现代 码码和和消息映射消息映射。MFC AppWizardexe生成的实现文件也包生成的实现文件也包 括六种。括六种。 l值得说明的是,向导生成的成员函数有很多,不要因为没有值得说明的是,向导生成的成员函数有很多,不要因为没有 使用某个成员函数而删除其声明和实现代码。并
44、且,用户一使用某个成员函数而删除其声明和实现代码。并且,用户一 般不要轻易修改文件中那些以灰色字体显示的代码,因为这般不要轻易修改文件中那些以灰色字体显示的代码,因为这 些代码是通过资源编辑器或些代码是通过资源编辑器或ClassWizard类向导进行维护的。类向导进行维护的。 向导为项目向导为项目Mysdi生成了框架窗口类的实现文件生成了框架窗口类的实现文件Mainfrm.cpp,该该 文 件 包 含 了 窗 口 框 架 类文 件 包 含 了 窗 口 框 架 类 C M a i n F r a m e 的 实 现 代 码 , 主 要 是的 实 现 代 码 , 主 要 是 CMainFrame类
45、成员函数的实现,它实现的框架窗口是应用程序的主类成员函数的实现,它实现的框架窗口是应用程序的主 窗口。窗口。 CMainFrame类的四个主要成员函数:类的四个主要成员函数: lAssertValid():诊断诊断CMainFrame对象是否有效,调试用。对象是否有效,调试用。 lDump():输出输出CMainFrame对象的状态信息,调试用。对象的状态信息,调试用。 lOnCreate():响应响应WM_CREATE的消息处理函数。创建工具栏的消息处理函数。创建工具栏 m_wndToolBar和状态栏和状态栏m_wndStatusBar。而视图窗口是由基类而视图窗口是由基类 CFrameW
46、nd的成员函数的成员函数OnCreate()通过调用通过调用OnCreateClient()函数函数 创建的。创建的。 l PreCreateWindow():如果要创建一个非默认风格的窗口,可以重如果要创建一个非默认风格的窗口,可以重 载该函数(虚函数),在函数中通过修改载该函数(虚函数),在函数中通过修改CREATESTRUCT结构参结构参 数数cs来改变窗口类、窗口风格、窗口大小和位置等。来改变窗口类、窗口风格、窗口大小和位置等。 virtual BOOL PreCreateWindow(CREATESTRUCT CREATESTRUCTCREATESTRUCT结构定义了创建函数创建窗口
47、所用的初始参数结构定义了创建函数创建窗口所用的初始参数 ,其定义如下:,其定义如下: typedef struct tagCREATESTRUCT LPVOID lpCreateParams; / 创建窗口的基本参数创建窗口的基本参数 HANDLE hInstance; / 拥有将创建的窗口的模块实例句柄拥有将创建的窗口的模块实例句柄 HMENU hMenu; / 新窗口的菜单句柄新窗口的菜单句柄 HWND hwndParent; / 新窗口的父窗口句柄新窗口的父窗口句柄 int cy; / 新窗口的高度新窗口的高度 int cx; / 新窗口的宽度新窗口的宽度 int y; / 新窗口的左上
48、角新窗口的左上角Y坐标坐标 int x; / 新窗口的左上角新窗口的左上角X坐标坐标 LONG style; / 新窗口的风格新窗口的风格 LPCSTR lpszName; / 新窗口的名称新窗口的名称 LPCSTR lpszClass; / 新窗口的窗口类名新窗口的窗口类名 DWORD dwExStyle; / 新窗口的扩展参数新窗口的扩展参数 CREATESTRUCT; BOOL CMainFrame:PreCreateWindow(CREATESTRUCT / TODO: Modify the Window class or styles here by modifying / the
49、CREATESTRUCT cs / 修改主窗风格修改主窗风格 cs.style /去除标题条中的文档名去除标题条中的文档名 cs.style /去除可改变大小的边框去除可改变大小的边框 cs.style |= WS_DLGFRAME; /增加不能改变大小的边框增加不能改变大小的边框 / 确定主窗的大小和初始位置确定主窗的大小和初始位置 int cxScreen = :GetSystemMetrics(SM_CXSCREEN);/获得屏幕宽获得屏幕宽 int cyScreen = :GetSystemMetrics(SM_CYSCREEN); /获得屏幕高获得屏幕高 cs.x = 0; / 主窗
50、位于左上角主窗位于左上角 cs.y = 0; cs.cx = cxScreen/2; / 主窗宽为主窗宽为1/2屏幕宽屏幕宽 cs.cy = cyScreen/2; / 主窗高为主窗高为1/2屏幕高屏幕高 return TRUE; 在项目工作区在项目工作区ClassView页面打开页面打开CMainFrame类,双击成类,双击成 员函数员函数PreCreateWindow()在编辑窗口打开该函数,添加代码:在编辑窗口打开该函数,添加代码: BOOL CMainFrame:PreCreateWindow(CREATESTRUCT / TODO: Modify the Window class o
51、r styles here cs.style / 取消窗口的最大化按钮取消窗口的最大化按钮 return TRUE; 习题:习题:24 向导为项目向导为项目Mysdi生成了文档类的实现文件生成了文档类的实现文件MysdiDoc.cpp。 与框架类与框架类CMainFrame类似,文档类类似,文档类CMysdiDoc也定义了两个用也定义了两个用 于调试的成员函数于调试的成员函数AssertValid()和和Dump。 文档类文档类CMysdiDoc的成员函数:的成员函数: l AssertValid() l Dump() l OnNewDocument():当用户执行当用户执行File菜单中菜单
52、中New命令时,命令时,MFC应应 用程序框架会调用函数用程序框架会调用函数OnNewDocument()来完成新建文档的工作。来完成新建文档的工作。 l Serialize():负责文档数据的磁盘读写操作。(第负责文档数据的磁盘读写操作。(第5章)章) l由于由于SDI单文档应用程序中只处理一个文档对象,当执行单文档应用程序中只处理一个文档对象,当执行New命令时,命令时, 文档对象已经生成,因此文档类文档对象已经生成,因此文档类CMysdiDoc的构造函数不会再被调的构造函数不会再被调 用。所以,用。所以,SDI应用程序不要在构造函数中进行文档对象成员变量应用程序不要在构造函数中进行文档对
53、象成员变量 的初始化,而应在的初始化,而应在OnNewDocument()函数中。函数中。 l在文档派生类在文档派生类CMysdiDoc重载的重载的OnNewDocument()函数中,首先需函数中,首先需 要调用基类要调用基类CDocument的的OnNewDocument()函数。函数。 向导为项目向导为项目Mysdi生成了视图类的源文件生成了视图类的源文件MysdiView.cpp, 该文件主要定义了视图类的成员函数。视图对象用来显示文档该文件主要定义了视图类的成员函数。视图对象用来显示文档 对象的内容。与框架类和文档类一样,视图类对象的内容。与框架类和文档类一样,视图类CMysdiVi
54、ew也定也定 义了两个用于调试的成员函数义了两个用于调试的成员函数AssertValid()和和Dump()。 视图类视图类CMysdiView的成员函数:的成员函数: lGetDocument():用于获取当前文档对象的指针用于获取当前文档对象的指针m_pDocument。 如果是建立程序的如果是建立程序的Release发行版,函数发行版,函数GetDocument()作为内嵌作为内嵌 (inline)函数来实现。函数来实现。 CMysdiDoc* CMysdiView:GetDocument() / non-debug version is inline ASSERT(m_pDocumen
55、t-IsKindOf(RUNTIME_CLASS(CMysdiDoc); return (CMysdiDoc*)m_pDocument; 例例4_4:修改程序:修改程序Mysdi,为为CMysdiDoc文档类定义一个字符串类文档类定义一个字符串类 型的成员变量,在型的成员变量,在OnNewDocument()函数中初始化成员变量。在函数中初始化成员变量。在 OnDraw()函数中访问该成员变量,并在屏幕上输出它的值。函数中访问该成员变量,并在屏幕上输出它的值。 (1)在头文件)在头文件MysdiDoc.h文档类文档类CMysdiDoc的定义中增加成员变量的定义中增加成员变量 m_szText,
56、用于保存将要显示的文本信息:用于保存将要显示的文本信息: public: char* * m_szText; ( 2 ) 在 文 档 类 实 现 文 件) 在 文 档 类 实 现 文 件 M y s d i D o c . c p p 中 找 到 成 员 函 数中 找 到 成 员 函 数 OnNewDocument(),添加初始化添加初始化m_szText的代码:的代码: lOnDraw():虚函数,它负责文档对象的数据在用户视图区的显示虚函数,它负责文档对象的数据在用户视图区的显示 输出。输出。 void CMysdiView:OnDraw(CDC* pDC) CMysdiDoc* pDoc
57、 = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here (3)在视图类实现文件在视图类实现文件MysdiView.cpp中找到成员函数中找到成员函数OnDraw(),向导向导 创建的函数框架中已自动添加了函数创建的函数框架中已自动添加了函数GetDocument()的调用语句,以获的调用语句,以获 取与当前视图相关联的文档指针取与当前视图相关联的文档指针pDoc。手工添加如下代码,通过手工添加如下代码,通过pDoc访访 问文档类问文档类CMysdiDoc的成员变量的成员变量m_szText
58、,用于在屏幕上输出。用于在屏幕上输出。 void CMysdiView:OnDraw(CDC* pDC) / pDC是输出设备环境的指针是输出设备环境的指针 CMysdiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / 得到当前文档指针得到当前文档指针pDoc / TODO: add draw code for native data here pDC-TextOut(100, 100, pDoc-m_szText); / 通过通过pDoc访问文档对象的成员变量访问文档对象的成员变量 BOOL CMysdiDoc:OnNewDocument( )
59、 if (!CDocument:OnNewDocument() return FALSE; / TODO: add reinitialization code here, m_szText = “这是一个单文档程序!这是一个单文档程序!”; / 初始化初始化 return TRUE; 习题:习题:25 l 为文档对象增加数据成员为文档对象增加数据成员stunum表示学号;表示学号;stuname表示学生姓名表示学生姓名 并在视图中显示文档对象中的内容。并在视图中显示文档对象中的内容。 l 当在视图窗口双击鼠标时,能够使学号每次递增当在视图窗口双击鼠标时,能够使学号每次递增1,并在视图上反,并在
60、视图上反 映学号的变化。映学号的变化。 l 当选择菜单项当选择菜单项“文件文件”|”新建新建”,学号重新归,学号重新归0。 程序代码提示:程序代码提示: CMysdiDoc:CMysdiDoc() / TODO: add one-time construction code here stunum=0; stuname=noname; void CMysdiView:OnDraw(CDC* pDC) CMysdiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江省杭州市杭州市萧山区高桥初级中学2026年数学七上期末监测模拟试题含解析
- 江苏省常州市武进区礼嘉中学2026-2027学年七上数学期末综合测试试题含解析
- 十堰市竹山县2027届数学四年级第一学期期末教学质量检测模拟试题含解析
- 某钢铁厂采购管理办法
- 秋季工地防火安全演练实施方案
- 建设工程施工现场高空作业安全管理
- 建筑深基坑施工质量控制手册
- 某纸业集团生产管理准则
- PE给水管道基坑施工安全制度
- 智能高铁旅游要执行高铁旅游线路开发安全防范措施
- 2026年新教材外研版九年级上册英语期末复习:Unit 1-6共6套 单元提升测试卷汇编(含答案)
- 2026年高考广西卷物理高考真题(解析版)
- 2026高考大纲正式版理科数学
- 2026年肉牛养殖数字化技术与市场竞争力报告
- 2026年北京公务员考试《行测》考试试题及答案
- 高血压患者的健康教育内容
- MOOC 研究生学术规范与学术诚信-南京大学 中国大学慕课答案
- 感染性疾病课件:新发传染病
- 项目部生产驻地地质灾害应对方案
- GB 29139-2012磷酸二铵单位产品能源消耗限额
- 蔬菜的贮藏方式与方法课件
评论
0/150
提交评论