14
励志照亮人生 编程改变命运零基础学 Visual C++
第1 章Visual C++6.0基本应用程序的创建上节介绍了Visual C++6.0集成开发环境,对于初学者而言,更关心的是如何利用Visual C++6.0集成开发环境设计开发应用程序。Visual C++6.0提供了应用程序框架生成向导(AppWizard),使用它可以自动生成一个简单的应用程序。
本章将主要介绍使用AppWizard创建的几种常用的应用程序框架,以及程序的编译、连接、运行与调试几方面的内容。
1.1 使用AppWizard生成工程在Visual C++6.0中,使用AppWizard可以自动生成应用程序框架,用户只需在此框架的基础上,
编程实现所需的特定功能。
1.1.1 工程与工作区在Visual C++6.0中,工程(Project,也称为项目)是应用程序开发的基本单位。工程的实质是一些相互关联的源文件的集合,可以把项目理解成一个工作任务,用户的工作都是围绕这一任务的。工程最后经过编译、链接生成可执行文件(或者是其他部件,如动态链接库DLL)。
在Visual C++6.0开发环境中,工程包含在工作区间(Workspace)中,一个工作区可以管理多个工程。在Visual C++6.0集成开发环境中,可以通过工作区窗口管理和维护其下的工程。在新建一个工程中,可以选择为该工程新建一个工作区还是加入当前工作区。
1.1.2 AppWizard可创建的工程类型在Visual C++6.0开发环境中,创建新的工程,需要执行“File”→“New”菜单命令,在“New”
对话框的“Projects”选项卡中显示有可创建的工程类型,如图1.1所示。
图1.1,New”对话框创建工程
15
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建单击要创建的工程类型,然后在“Project name”文本框中键入项目的名字,在“Location”文本框中需键入工程存放的路径。
说明在使用AppWizard生成一个应用程序时,Visual C++会在用户选择的路径下以当前的工程名建立一个目录,然后将自动生成的文件存放在该路径下。
如果要添加新的项目到打开的工作区中,请选择“Add to current workspace”选项,否则将启动创建包含新项目的新工作区。如果要使新项目成为已有工程的子工程,请选中“Dependency of”复选框并指定工程名。
单击“OK”按钮,即启动了AppWizard向导。不同类型的工程,会有不同的AppWizard向导对话框,用于工程的初始设置。
Visual C++6.0中可以创建的工程类型及其说明如表1.1所示。
表1.1 可创建的项目类型工程类型说明
ATL COM AppWizard创建ATL应用程序
Custom AppWizard创建自定义的AppWizard
Database Project直接创建数据库项目
DevStudio Add-in Wizard创建自动化宏
ISAPI Extension Wizard创建Internet服务器或过滤器
Makefile创建Make文件
MFC ActiveX ControlWizard创建ActiveX控件程序
MFC AppWizard(exe)创建MFC可执行程序
MFC AppWizard(dll)创建MFC动态链接库
New Database Wizard创建SQL服务器数据库
Win32 Application创建Win32应用程序
Win32 Console Application创建Win32控制台应用程序
Win32 Dynamic_Link Library创建Win32动态链接库
Win32 Static Library创建Win32静态库说明作为VC的基础教程,本书后面章节的介绍只涉及到其中几种常用项目的开发。
在下面几节中,将具体介绍Win32控制台应用程序和MFC可执行程序(包括单文档应用程序和对话框应用程序)的创建。
1.2 Win32控制台应用程序
Win32控制台应用程序(Win32 Console Application)为一个类似DOS风格文本显示程序,在其中可以实现基本的C/C++程序的创建,多用于C/C++语言学习的测试环境。对于刚学习完C/C++语言的VC初学者来讲,理解起来非常容易。
本节将结合一个具体的Win32控制台应用程序实例的创建、开发,讲解Visual C++6.0开发环境中
16
励志照亮人生 编程改变命运零基础学 Visual C++
程序代码的创建、编辑以及工程的编译、链接、执行和调试方法。
1.2.1 利用向导生成Win32控制台工程
Win32控制台项目的生成步骤可表示如下:
(1)启动Visual C++6.0,执行“File”→“New”菜单命令,在“New”对话框(如图1.1所示)
的“Projects”选项卡左侧的项目列表中选中“Win32 Console Application”。
(2)在“Project name”文本框中键入项目的名称“ConsolePro”,在“Location”文本框中指定所要创建的项目的位置(文件夹)。
(3)单击“OK”按钮,在弹出的“Win32 Console Application”对话框中,选中“An empty
project”单选框(默认)后,单击“Finish”按钮,如图1.2所示。
图1.2,Win32 Console Application”对话框窗口
(4)在新弹出的“New Project Information”对话框中,单击“OK”按钮,项目即创建成功。
项目创建成功后,在工作区窗口的FileView选项卡内,就可以看到一个名为“ConsolePro”的工程文件,“ConsolePro files”目录下的“Source Files”、“Header Files”、“Resource Files”三个子目录分别用于分类放置与ConsolePro项目有关的源程序文件、头文件和相关资源文件。
说明创建项目时,选择创建的为空项目,所以“Source Files”、“Header Files”、“Resource Files”三个子目录下没有任何文件。
1.2.2 生成和编辑源文件使用AppWizard创建了工程之后,用户就可以在工程框架的基础上,添加、编辑源文件与资源,
实现用户的功能需求。
本实例实现的功能是将一个字符串经加密转换为一个新的串。其加密方法是:当字符串中包含有
‘a’?‘y’的小写字母时,用后一个字母代替前一个字母,其中‘z’变换为‘a’。例如:
原串为:Tell you a secret!
加密后的串为:Tfmm zpv b tfdsfu!
17
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建要求程序对输入串加密,输出加密前和加密后的串,再将加密后的字符串解密输出。
首先需要为工程添加实现文件(.cpp),其实现过程如下:
执行“File”→“New”菜单命令,在“New”对话框的“Files”选项卡中显示有可创建的文件类型,如图1.3所示。
图1.3,New”对话框创建文件可以看到Visual C++6.0支持多种文件的创建与编辑,其支持的文件类型及其说明如表1.2所示。
表1.2 可创建的文件类型文件类型说明文件类型说明
Active Server Page创建活动服务器页Icon File创建图标文件
Binary File创建二进制文件Macro File创建宏文件
Bitmap File创建位图文件ODBC Script File创建ODBC脚本文件
C/C++ Header File创建C/C++头文件Resource Script创建资源脚本文件
Cursor File创建光标文件Resource Template创建资源模板文件
HTML Page创建HTML文件Text File创建文本文件单击选中“C++ Source File”文件类型,在“File”文本框中键入文件名“Secret”。Location文本框下的输入框是输入文件存放的有效目录,默认的目录是项目的根目录,用户也可以根据需要自己组织源文件。
注意对话框右边的“Add to project”一定要选中,表示新建的文件加入到项目中。
单击“OK”按钮后,即创建了资源文件“Secret.cpp”。这时,系统自动进入文本编辑状态,用户可以进行源程序的录入工作。
说明当用户编辑一个文件时,VC标题栏同时显示正在编辑的文件的名称,如果该文件名后带一个星号(*),说明该文件进行了修改,尚未存盘。
18
励志照亮人生 编程改变命运零基础学 Visual C++
在工作区窗口“FileView”选项卡的“Source File”目录下,列出了新创建的资源文件名。如果需要把磁盘上其他目录下的源文件加入到某个工程中,只要右击
“Source Files”目录,在弹出的菜单中,选择“Add Files to Folder...”
命令,如图1.4所示,在弹出的“Insert Files into Project”对话框中选择这个源文件即可。
另外,如果需要从工作区中去除某些无关的文件,则只要在工作区窗口中选中文件,然后按【Delete】键即可。
注意这种操作方式仅仅表明这些文件不是工程文件的一个组成部分,
并不是文件操作中的删除工作,也就是说文件仍然存储在硬盘上。
添加的资源文件“Secret.cpp”的代码清单如下:
// Secret.cpp
#include<iostream>
using namespace std;
void secret(char* s) //加密函数
{
while(*s!='\0')
{
if(*s>96&&*s<122) //字符为"a"?"z"
*s=*s+1;
else if(*s==122)
*s='a';
s++;
}
}
void desecret(char* s) //解密函数
{
while(*s!='\0')
{
if(*s>97&&*s<123) //字符为"a"?"z"
*s=*s-1;
else if(*s==97)
*s='z';
s++;
}
}
int main(){
char st[]="Tell you a secret!";
cout<<"原始字符串,"<<st<<endl;
secret(st);//加密
cout<<"加密字符串,"<<st<<endl;
desecret(st);//解密
cout<<"解密字符串,"<<st<<endl;
return 0;
}
图1.4 快捷菜单
19
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建
1.2.3 编译程序编译是对单个文件进行的,源程序文件经编译后,将生成目标文件(obj文件),供链接用。编译操作的方法为:执行“Build”→“Compile”菜单命令,也可使用快捷键【Ctrl+F7】。VC工作台已把当前文件名放在Compile命令后,使得编译动作更直观明了。
执行上述命令,即对源程序进行了编译,编译成功与否的结果信息,显示在输出窗口中。
说明实际上,直接执行“Build”链接命令,会首先对所有的源文件进行编译。Compile命令主要用于文件较多、调用关系复杂的项目中,将源文件逐个编译,确保无误后,再进行链接,提高效率。
如果程序中没有任何语法错误,输出窗口中将显示“0 error(s),0 warning(s)”信息,表示编译成功,即生成了目标文件,如图1.5所示。
图1.5 编译成功输出窗口若程序中有错误,输出窗口便显示出错误的个数,以及每个错误的代码和错误信息,如图1.6所示。
双击错误代码所在的行,系统就会立即在编辑区显示与其对应的错误代码行,并进入编辑状态。这时,
用户可根据给出的错误提示信息对源程序进行修改。修改完毕后,需要对源程序重新编译。
图1.6 有错误产生时的编译输出窗口对于Error错误(属语法错误)用户必须对其更正才能编译通过;对于Warning错误(属警告型错误),虽然不影响编译的通过,为了程序的稳健性,一般情况下,也需要进行更正。
说明编译过程中,系统只能检查源文件中一般的语法错误,并不能深入程序内部的检查,因此编译成功并不意味着程序最终能成功执行。
1.2.4 链接程序编译生成目标程序后,需要把目标程序与系统中的库函数链接(Link),生成最终的可执行的.exe
文件。
链接操作的方法为:执行“Build”→“Build”菜单命令,也可使用快捷键【F7】。同样Visual
C++6.0工作台已把项目名放在“Build”命令的后面。
“Build”命令包含了编译和链接。即对源程序直接进行“Build”操作,系统首先进行编译,编译成功后再进行链接,最后生成.exe文件。
对于文件较少的项目可以直接执行“Build”命令,同样在输出窗口中显示提示信息,如图1.7所示。
图1.7 链接后编译输出窗口当项目设置改变或项目中许多文件被修改,可以直接执行“Build”→“Rebuild All”菜单命令,
该命令将彻底重新编译链接整个项目。
1.2.5 运行程序程序编译并链接成功后,可以执行“Build”→“Execute”菜单命令或者按快捷键【Ctrl+F5】来运行程序。系统已自动将ConsolePro.exe放在“Execute”菜单命令后。
由于创建的是控制台程序,所以运行时系统将打开一个DOS窗口,运行结果如图1.8所示。
图1.8 程序运行结果
1.2.6 调试程序程序调试是程序开发中的重要环节,如果程序中出现逻辑错误,即使编译通过,也不能得到正确的结果。只有通过调试(Debug)才能查出程序设计上的深层问题,也可以检查代码执行效率,优化代码质量。
Visual C++6.0提供了动态调试功能,该功能可以一步步跟踪程序的执行流程,并检查变量值的变化情况。下面就简单介绍动态调试程序的方法。
1,单步执行单步执行就是一条一条语句地执行,每执行完一行语句,程序就暂停下来,以便调试者观察程序的执行状况。
按下快捷键【F10】或者【F11】,系统就处于单步执行状态,开始单步执行。对于本程序而言,
就从main()函数开始执行。
每按一下【F10】或者【F11】键,程序就执行一步(一行)。处在单步执行状态时,有一个黄色的箭头,指示将要执行的语句。单步执行时,在编辑窗口的下方会自动出现Variables窗口和Watch窗口,如图1.9所示。
20
励志照亮人生 编程改变命运零基础学 Visual C++
图1.9 单步调试程序界面
Variables窗口:Variables窗口中的Auto选项卡用于显示与当前正在执行语句有关的变量名和其当前值;Locals选项卡用于显示当前函数内所有变量的变量名和其当前值。如果需要,用户可以双击Variables窗口中显示的某个变量的Value域,人为地修改该变量的当前值继续调试下面的程序。
Watch窗口:在Watch窗口中,可以添加需要长期观察取值情况的变量名。双击Watch窗口中的
Name域,进入编辑状态,输入要察看的变量名,即可将该变量加入察看窗。用户可以通过观察这些变量的当前值,判断程序的执行状态。
快捷键【F10】和【F11】的区别在于,使用快捷键【F10】时,系统会把函数调用当作一条语句执行;而使用快捷键【F11】时,如果遇到函数的调用,则进入被调用函数内部,继续单步执行。快捷键【F10】和【F11】可以交替使用。
如果需要中途终止动态调试状态,执行“Debug”→“Stop Debugging”菜单命令,或者按下
【Shift+F5】快捷键即可。
2,设置断点执行采用单步执行的方法调试程序有时太慢,如果能够判断出逻辑错误的大致位置,就可以在程序中设置程序断点进行动态调试。
断点是用户在程序中设置的,能够使程序暂时中断执行的标志。执行时,如果没有遇到断点,程序将连续执行,遇到断点,程序就暂停执行。
(1)设置/取消断点在编辑区,将插入点光标定位于需要检查程序执行情况的语句,按下【F9】键,就完成了断点的设置,这行语句就是一个断点。程序中可以设置多个断点,凡是设置成断点的语句,其左侧都会显示
21
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建
22
励志照亮人生 编程改变命运零基础学 Visual C++
一个紫红色的圆点。
将插入点光标定位于已经设置了断点的语句内,按下【F9】键,就可以取消该断点。
(2)在断点之间运行程序设置断点之后,按下快捷键【F5】,程序开始执行。当遇到第一个断点时,暂停执行,此时该语句的左侧同样会显示一个黄色的指示箭头,在编辑窗口的下方会自动出现Variables窗口和Watch窗口,
如图1.10所示。在其中可以察看程序的执行情况。
图1.10 设置断点调试程序界面再次按下【F5】键,程序就从当前断点处继续执行,直到遇到下一个断点,再次暂时中断运行,
此时又可以察看程序的执行情况了。当然,如果没有遇到断点,程序会一直执行下去,直到执行完毕。
说明如果在循环体内设置了断点,则每次循环执行到此断点,程序便暂停运行。
当然,用户也可以在执行到断点处之后,变化调试方式,采样单步执行。实际上,单步执行和设置断点执行两种动态调试方法交替使用,能够更快地找到程序中的逻辑错误。在实际程序的动态调试时,一般都是交替地使用【F5】、【F10】和【F11】快捷键。
1.3 MFC应用程序框架
Visual C++6.0一个最主要用途就是基于MFC的Windows应用程序的设计,这也是本书的重点。
MFC提供了构造Windows应用程序的框架,它不仅为应用程序建立标准的结构,生成一系列起动文件,还提供标准的图形用户界面如菜单、工具栏、状态条等供开发人员在程序中补充完善,开发人员只需要完成针对特定应用的代码。使用应用程序框架的应用程序代码小,运行速度快,它提供的工具也降低了编码的难度。
1.3.1 基于对话框的应用程序框架
MFC Windows应用程序框架主要有两种类型:基于对话框的应用程序框架和基于文档/视图结构的应用程序框架。平时所见到的大多数Windows
应用程序均属于这两种框架。在本节简要介绍一下基于对话框的应用程序框架的创建。
(1)启动Visual C++6.0,执行“File”→
“New”菜单命令,在“New”对话框的“Projects”
选项卡左侧的项目列表中,选中“MFC
AppWizard(exe)”。
(2)在“Project name”文本框中键入项目的名称“DialogbaseDemo”,在“Location”文本框中指定所要创建的项目的位置(文件夹)。
(3)单击“OK”按钮,在弹出的“MFC
AppWizard step1”对话框中,选中“Dialog based”
单选框后,单击“Next”按钮,如图1.11所示。
(4)此时会出现“MFC AppWizard step2”对话框,在其中也包含一些选项,这里采用默认的设置,单击“Next”按钮,出现“MFC AppWizard
step3”对话框,依次类推均采用默认的设置。
(5)在最后出现的“New Project Information”对话框中,单击“OK”按钮,项目即创建成功。
项目创建成功后,在工作区窗口会发现自动生成了一些相关类和资源,在资源编辑窗口显示的则是自动生成的对话框的界面,如图1.12所示。
图1.12 AppWizard生成的基于对话框的MFC项目
23
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建图1.11,MFC AppWizard step1”对话框窗口
24
励志照亮人生 编程改变命运零基础学 Visual C++
用户可以在此基础上添加、修改、设计资源,完善功能设计,这在后面的章节中会有详细地介绍。
执行“Build”→“Execute”菜单命令(或快捷键
【F7】)编译工程,而后直接使用快捷键【Ctrl+F5】运行程序,程序的运行结果如图1.13所示。
生成的程序只是带有“确定”和“取消”按钮的一个空对话框窗口,单击“确定”或“取消”按钮,将退出对话框窗口。
此时,在工程DialogbaseDemo目录下会生成一个
Debug子目录,在该子目录中包含有项目生成的可执行文件“DialogbaseDemo.exe”。
说明基于对话框的MFC应用程序框架的创建及其结构在本书的第11章会有详细介绍。
1.3.2 基于文档/视图结构的MFC应用程序基于文档/视图结构的应用程序是最常见的Windows应用程序结构,如常用的Word、Excel等软件均是采用这种结构。其典型特征是应用程序界面由框架窗口、客户窗口、菜单栏、工具栏和状态栏等组成。
使用Visual C++6.0的AppWizard可以创建两种类型的基于文档/视图结构的应用程序框架:单文档
(Single Document Interface,SDI)和多文档(Multiple Documents Interface,MDI)。本节将简单介绍一下使用AppWizard创建单文档MFC应用程序的过程。
(1)启动Visual C++6.0,执行“File”→“New”菜单命令,在“New”对话框的“Projects”选项卡左侧的项目列表中选中“MFC AppWizard(exe)”。
(2)在“Project name”文本框中键入项目的名称
“SDIDemo”,在“Location”文本框中指定所要创建的项目的位置(文件夹)。
(3)单击“OK”按钮,在弹出的“MFC AppWizard
step1”对话框中,选中“Single document”单选框后,
单击“Next”按钮,如图1.14所示。
(4)与创建基于对话框的MFC程序类似,接着会出现一系列的设置向导对话框,对生成程序的相关特性进行设置,这里均采用默认设置。在最后出现的“New
Project Information”对话框中,单击“OK”按钮,程序即创建成功。
程序创建成功后,在工作区窗口会发现自动生成了一些相关类和资源,如图1.15所示。
用户可以在此基础上完善功能设计,这在后面的章节中会有详细地介绍。
执行“Build”→“Execute”菜单命令(或按快捷键【F7】)编译程序,而后直接使用快捷键
【Ctrl+F5】运行程序,程序的运行结果如图1.16所示。
同样,此时在工程SDIDemo目录下会生成一个Debug子目录,在该子目录中包含有项目生成的可执行文件“SDIDemo.exe”。
图1.13 对话框项目运行结果图1.14,MFC AppWizard step1”对话框窗口
25
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建图1.15 AppWizard生成的基于单文档的MFC项目图1.16 单文档项目运行结果说明基于文档/视图结构的MFC应用程序框架的创建及其结构在本书的第10章会有详细介绍。
1.3.3 文档/视图结构简介文档/视图结构是在Visual C++中使用MFC开发基于文档的应用程序的基本框架,在这个框架中,
数据的维护及其显示是分别由两个不同,但又彼此紧密相关的对象—文档和视图负责的。
文档是一个应用程序数据基本元素的集合,它构成应用程序所使用的数据单元,另外它还提供了管理和维护数据的手段。
视图是数据的用户窗口,为用户提供了文档的可视的数据显示,它把文档的部分或全部内容在窗口中显示出来。视图还给用户提供了一个与文档中的数据交互的界面,它把用户的输入转化为对文档中数据的操作。
每个文档都会有一个或多个视图显示,一个文档可以有多个不同的视图。比如,在Excel电子表格中,我们可以将数据以表格方式显示,也可以将数据以图表方式显示。
文档和视图的关系可简单表示为如图1.17所示。
26
励志照亮人生 编程改变命运零基础学 Visual C++
说明可将文档比作一个文件袋,专门用于保存文件数据,需要看时从文件袋(文档)中取出来,放到桌面(视图)上查看。
下面以上节生成的单文档应用程序“SDIDemo”为例,
简单分析一下程序框架的结构及工作过程。
在工程“SDIDemo”中,系统共生成了五个类,其功能如下。
CAboutDlg:对话框类,即对应应用程序执行“帮助”→“关于”菜单命令后,弹出的“关于”对话框。
CSDIDemoApp:派生自应用程序类CWinApp,为应用程序对象,负责应用程序的初始化和退出清理工作。
CMainFrame:派生自CFrameWnd类,为框架窗口对象,对应应用程序的主窗口。
CSDIDemoDoc:派生自CDocument文档类,为文档对象,储存与应用程序相关的数据。其在应用程序中没有直观的对应关系。
CSDIDemoView:派生自视图类CView,为视图对象,对应应用程序的客户窗口,用来显示文档数据的内容。
对应用程序而言,视图是程序窗口的客户区,框架窗口是客户区的框架,程序数据显示在视图窗口,用户通过视图与程序交互。同时,文档、视图和框架三者之间相互关联、相互协调,彼此都包含了指向对方的指针。文档、视图与框架的关系,如图1.18所示。
图1.18 文档、视图与框架的关系
1.4 VC++程序的工程文件与开发过程前面几节介绍了使用Visual C++6.0集成开发环境开发应用程序的一般过程,本节将从总体上介绍图1.17 文档、视图关系视图文档当前可见的文档部分应用程序对象文档对象框架窗口对象可向框架对象发送消息可向视图对象发送消息视图对象可实现双向数据交换一下VC++程序的工程文件以及MFC应用程序的生成过程。
1.4.1 VC++程序的工程文件利用Visual C++6.0创建的工程中包含了框架程序所有的类、全局变量的声明与实现,以及所用到的所有资源。在Windows资源管理器中打开工程“SDIDemo”的工程目录,会发现其中有20个文件和两个目录—res和debug。
说明
res目录用于存放工程的资源文件,Debug目录用于存放编译、链接时产生的中间文件和最终生成的可执行文件。
一般来讲,使用Visual C++6.0 AppWizard创建的工程,其包含的文件包括4部分:工作区和工程文件、应用程序的源文件和头文件、资源文件和预编译的头文件。
在实例工程“SDIDemo”中,其包含的主要文件及作用如表1.3所示。
表1.3,SDIDemo”工程包含的主要文件及作用文件类别文件名说明工作区和
SDIDemo.dsw
开VC开发环境生成的工作区(Workspace)文件,包含当前工作区的工程信息工程文件
SDIDemo.dsp
开VC开发环境生成的工程文件,包含当前工程的设置,包含的文件等信息
SDIDemo.clw开类向导(ClassWizard)生成的用来存放类信息的文件
SDIDemo.h开CSDIDemoApp类的头文件
SDIDemo.cpp
开CSDIDemoApp类的源文件,它将创建CSDIDemoApp类的一个对象,
并覆盖InitInstance()函数应用程序的源MainFrm.h开CMainFrame类头文件文件和头文件MainFrm.cpp开CMainFrame类的源文件
SDIDemoDoc.h开CSDIDemoDoc类的头文件
SDIDemoDoc.cpp开CSDIDemoDoc类的源文件
SDIDemoView.h开CSDIDemoView类的头文件
SDIDemoView.cpp开CSDIDemoView类的源文件资源文件
Resource.h开工程的头文件,定义了资源ID,供SDIDemo.rc文件使用
SDIDemo.rc
开资源文件,包含了标准的MFC类的资源,如默认的About对话框、菜单、工具栏和快捷键等资源预编译的头文件StdAfx.h、StdAfx.cpp
开VC开发环境把常用的MFC头文件,如afxext.h、afxdisp.h、afxdtctl.h、
afxcmn.h等,都放在StdAfx.h文件中,然后在StdAfx.cpp文件中包含这个头文件,这样StdAfx.cpp文件只编译一次,生成预编译头文件,避免了每次编译时,都重新编译这些常用的MFC头文件
1.4.2 VC++项目的开发过程可见,在Visual C++6.0集成开发环境中开发项目非常容易,一个用C++开发的项目的通用开发过程可以表示为图1.19所示。
27
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建图1.19 C++项目的开发过程简单来说,使用Visual C++6.0集成开发环境开发应用程序的一般过程分为创建项目、编辑代码、
编辑程序、链接程序和运行程序几个阶段,各阶段实现实现的主要功能如图1.20所示。
建立一个项目的第一步是利用编辑器建立程序代码文件,包括头文件、代码文件、资源文件等。然后,启动编译程序,编译程序首先调用预处理程序处理程序中的预处理命令(如#include、
#define等),经过预处理程序处理的代码将作为编译程序的输入。
编译对用户程序进行词法和语法分析,建立目标文件,文件中包括机器代码、连接指令、外部引用以及从该源文件中产生的函数和数据名。此后,连接程序将所有的目标代码和用到的静态连接库的代码连接起来,为所有的外部变量和函数找到其提供地点,
最后产生一个可执行文件。一般有一个makefile文件来协调各个部分产生可执行文件。
可执行文件分为两种版本:Debug和Release。Debug版本用于程序的开发过程,该版本产生的可执行程序带有大量的调试信息,可以供调试程序使用;而Release版本作为最终的发行版本,没有调试信息,并且带有某种形式的优化。
说明选择是产生Debug版本还是Release版本的方法是,在Developer Studio中选择菜单Build|Set Active
Configuration,在弹出的对话框中,选择所要的类型,然后单击“OK”按钮,关闭对话框。
Visual C++6.0集成开发环境中集成了编辑器、编译器、连接器以及调试程序,覆盖了开发应用程序的整个过程,程序员不需要脱离这个开发环境就可以开发出完整的应用程序。
而MFC应用程序相比于控制台应用程序,除了源文件外,还增加了包含菜单、工具栏、对话框等资源信息的资源文件,因此其应用程序的开发、实现过程如图1.21所示。
28
励志照亮人生 编程改变命运零基础学 Visual C++
hello.cpp iostream.h
hello.obj
hello.exe
hello.exe
图1.20 VC程序的开发阶段程序源代码的录入,
生成源程序*.cpp,*.h等编辑编译链接执行语法分析查错,翻译生成目标程序*.obj
运行可执行程序.exe,
完成用户的任务与其他目标程序或库链接装配,生成可执行程序*.exe
Source Header Files
mlibcewq.lib
Makefile
Editor
Preprocessor
Compiler
Object File
LibrariesObject Files
Release VersionDebug Version
Linker
图1.21 MFC应用程序开发过程
29
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建应用程序向导集成开发环境资源编辑器编译资源编译应用程序类向导
.obj,res
Create
Build
.DEF,CPP,DSW
.H,DSP
源文件
.ICO,RC,BMP
资源文件
励志照亮人生 编程改变命运零基础学 Visual C++
第1 章Visual C++6.0基本应用程序的创建上节介绍了Visual C++6.0集成开发环境,对于初学者而言,更关心的是如何利用Visual C++6.0集成开发环境设计开发应用程序。Visual C++6.0提供了应用程序框架生成向导(AppWizard),使用它可以自动生成一个简单的应用程序。
本章将主要介绍使用AppWizard创建的几种常用的应用程序框架,以及程序的编译、连接、运行与调试几方面的内容。
1.1 使用AppWizard生成工程在Visual C++6.0中,使用AppWizard可以自动生成应用程序框架,用户只需在此框架的基础上,
编程实现所需的特定功能。
1.1.1 工程与工作区在Visual C++6.0中,工程(Project,也称为项目)是应用程序开发的基本单位。工程的实质是一些相互关联的源文件的集合,可以把项目理解成一个工作任务,用户的工作都是围绕这一任务的。工程最后经过编译、链接生成可执行文件(或者是其他部件,如动态链接库DLL)。
在Visual C++6.0开发环境中,工程包含在工作区间(Workspace)中,一个工作区可以管理多个工程。在Visual C++6.0集成开发环境中,可以通过工作区窗口管理和维护其下的工程。在新建一个工程中,可以选择为该工程新建一个工作区还是加入当前工作区。
1.1.2 AppWizard可创建的工程类型在Visual C++6.0开发环境中,创建新的工程,需要执行“File”→“New”菜单命令,在“New”
对话框的“Projects”选项卡中显示有可创建的工程类型,如图1.1所示。
图1.1,New”对话框创建工程
15
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建单击要创建的工程类型,然后在“Project name”文本框中键入项目的名字,在“Location”文本框中需键入工程存放的路径。
说明在使用AppWizard生成一个应用程序时,Visual C++会在用户选择的路径下以当前的工程名建立一个目录,然后将自动生成的文件存放在该路径下。
如果要添加新的项目到打开的工作区中,请选择“Add to current workspace”选项,否则将启动创建包含新项目的新工作区。如果要使新项目成为已有工程的子工程,请选中“Dependency of”复选框并指定工程名。
单击“OK”按钮,即启动了AppWizard向导。不同类型的工程,会有不同的AppWizard向导对话框,用于工程的初始设置。
Visual C++6.0中可以创建的工程类型及其说明如表1.1所示。
表1.1 可创建的项目类型工程类型说明
ATL COM AppWizard创建ATL应用程序
Custom AppWizard创建自定义的AppWizard
Database Project直接创建数据库项目
DevStudio Add-in Wizard创建自动化宏
ISAPI Extension Wizard创建Internet服务器或过滤器
Makefile创建Make文件
MFC ActiveX ControlWizard创建ActiveX控件程序
MFC AppWizard(exe)创建MFC可执行程序
MFC AppWizard(dll)创建MFC动态链接库
New Database Wizard创建SQL服务器数据库
Win32 Application创建Win32应用程序
Win32 Console Application创建Win32控制台应用程序
Win32 Dynamic_Link Library创建Win32动态链接库
Win32 Static Library创建Win32静态库说明作为VC的基础教程,本书后面章节的介绍只涉及到其中几种常用项目的开发。
在下面几节中,将具体介绍Win32控制台应用程序和MFC可执行程序(包括单文档应用程序和对话框应用程序)的创建。
1.2 Win32控制台应用程序
Win32控制台应用程序(Win32 Console Application)为一个类似DOS风格文本显示程序,在其中可以实现基本的C/C++程序的创建,多用于C/C++语言学习的测试环境。对于刚学习完C/C++语言的VC初学者来讲,理解起来非常容易。
本节将结合一个具体的Win32控制台应用程序实例的创建、开发,讲解Visual C++6.0开发环境中
16
励志照亮人生 编程改变命运零基础学 Visual C++
程序代码的创建、编辑以及工程的编译、链接、执行和调试方法。
1.2.1 利用向导生成Win32控制台工程
Win32控制台项目的生成步骤可表示如下:
(1)启动Visual C++6.0,执行“File”→“New”菜单命令,在“New”对话框(如图1.1所示)
的“Projects”选项卡左侧的项目列表中选中“Win32 Console Application”。
(2)在“Project name”文本框中键入项目的名称“ConsolePro”,在“Location”文本框中指定所要创建的项目的位置(文件夹)。
(3)单击“OK”按钮,在弹出的“Win32 Console Application”对话框中,选中“An empty
project”单选框(默认)后,单击“Finish”按钮,如图1.2所示。
图1.2,Win32 Console Application”对话框窗口
(4)在新弹出的“New Project Information”对话框中,单击“OK”按钮,项目即创建成功。
项目创建成功后,在工作区窗口的FileView选项卡内,就可以看到一个名为“ConsolePro”的工程文件,“ConsolePro files”目录下的“Source Files”、“Header Files”、“Resource Files”三个子目录分别用于分类放置与ConsolePro项目有关的源程序文件、头文件和相关资源文件。
说明创建项目时,选择创建的为空项目,所以“Source Files”、“Header Files”、“Resource Files”三个子目录下没有任何文件。
1.2.2 生成和编辑源文件使用AppWizard创建了工程之后,用户就可以在工程框架的基础上,添加、编辑源文件与资源,
实现用户的功能需求。
本实例实现的功能是将一个字符串经加密转换为一个新的串。其加密方法是:当字符串中包含有
‘a’?‘y’的小写字母时,用后一个字母代替前一个字母,其中‘z’变换为‘a’。例如:
原串为:Tell you a secret!
加密后的串为:Tfmm zpv b tfdsfu!
17
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建要求程序对输入串加密,输出加密前和加密后的串,再将加密后的字符串解密输出。
首先需要为工程添加实现文件(.cpp),其实现过程如下:
执行“File”→“New”菜单命令,在“New”对话框的“Files”选项卡中显示有可创建的文件类型,如图1.3所示。
图1.3,New”对话框创建文件可以看到Visual C++6.0支持多种文件的创建与编辑,其支持的文件类型及其说明如表1.2所示。
表1.2 可创建的文件类型文件类型说明文件类型说明
Active Server Page创建活动服务器页Icon File创建图标文件
Binary File创建二进制文件Macro File创建宏文件
Bitmap File创建位图文件ODBC Script File创建ODBC脚本文件
C/C++ Header File创建C/C++头文件Resource Script创建资源脚本文件
Cursor File创建光标文件Resource Template创建资源模板文件
HTML Page创建HTML文件Text File创建文本文件单击选中“C++ Source File”文件类型,在“File”文本框中键入文件名“Secret”。Location文本框下的输入框是输入文件存放的有效目录,默认的目录是项目的根目录,用户也可以根据需要自己组织源文件。
注意对话框右边的“Add to project”一定要选中,表示新建的文件加入到项目中。
单击“OK”按钮后,即创建了资源文件“Secret.cpp”。这时,系统自动进入文本编辑状态,用户可以进行源程序的录入工作。
说明当用户编辑一个文件时,VC标题栏同时显示正在编辑的文件的名称,如果该文件名后带一个星号(*),说明该文件进行了修改,尚未存盘。
18
励志照亮人生 编程改变命运零基础学 Visual C++
在工作区窗口“FileView”选项卡的“Source File”目录下,列出了新创建的资源文件名。如果需要把磁盘上其他目录下的源文件加入到某个工程中,只要右击
“Source Files”目录,在弹出的菜单中,选择“Add Files to Folder...”
命令,如图1.4所示,在弹出的“Insert Files into Project”对话框中选择这个源文件即可。
另外,如果需要从工作区中去除某些无关的文件,则只要在工作区窗口中选中文件,然后按【Delete】键即可。
注意这种操作方式仅仅表明这些文件不是工程文件的一个组成部分,
并不是文件操作中的删除工作,也就是说文件仍然存储在硬盘上。
添加的资源文件“Secret.cpp”的代码清单如下:
// Secret.cpp
#include<iostream>
using namespace std;
void secret(char* s) //加密函数
{
while(*s!='\0')
{
if(*s>96&&*s<122) //字符为"a"?"z"
*s=*s+1;
else if(*s==122)
*s='a';
s++;
}
}
void desecret(char* s) //解密函数
{
while(*s!='\0')
{
if(*s>97&&*s<123) //字符为"a"?"z"
*s=*s-1;
else if(*s==97)
*s='z';
s++;
}
}
int main(){
char st[]="Tell you a secret!";
cout<<"原始字符串,"<<st<<endl;
secret(st);//加密
cout<<"加密字符串,"<<st<<endl;
desecret(st);//解密
cout<<"解密字符串,"<<st<<endl;
return 0;
}
图1.4 快捷菜单
19
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建
1.2.3 编译程序编译是对单个文件进行的,源程序文件经编译后,将生成目标文件(obj文件),供链接用。编译操作的方法为:执行“Build”→“Compile”菜单命令,也可使用快捷键【Ctrl+F7】。VC工作台已把当前文件名放在Compile命令后,使得编译动作更直观明了。
执行上述命令,即对源程序进行了编译,编译成功与否的结果信息,显示在输出窗口中。
说明实际上,直接执行“Build”链接命令,会首先对所有的源文件进行编译。Compile命令主要用于文件较多、调用关系复杂的项目中,将源文件逐个编译,确保无误后,再进行链接,提高效率。
如果程序中没有任何语法错误,输出窗口中将显示“0 error(s),0 warning(s)”信息,表示编译成功,即生成了目标文件,如图1.5所示。
图1.5 编译成功输出窗口若程序中有错误,输出窗口便显示出错误的个数,以及每个错误的代码和错误信息,如图1.6所示。
双击错误代码所在的行,系统就会立即在编辑区显示与其对应的错误代码行,并进入编辑状态。这时,
用户可根据给出的错误提示信息对源程序进行修改。修改完毕后,需要对源程序重新编译。
图1.6 有错误产生时的编译输出窗口对于Error错误(属语法错误)用户必须对其更正才能编译通过;对于Warning错误(属警告型错误),虽然不影响编译的通过,为了程序的稳健性,一般情况下,也需要进行更正。
说明编译过程中,系统只能检查源文件中一般的语法错误,并不能深入程序内部的检查,因此编译成功并不意味着程序最终能成功执行。
1.2.4 链接程序编译生成目标程序后,需要把目标程序与系统中的库函数链接(Link),生成最终的可执行的.exe
文件。
链接操作的方法为:执行“Build”→“Build”菜单命令,也可使用快捷键【F7】。同样Visual
C++6.0工作台已把项目名放在“Build”命令的后面。
“Build”命令包含了编译和链接。即对源程序直接进行“Build”操作,系统首先进行编译,编译成功后再进行链接,最后生成.exe文件。
对于文件较少的项目可以直接执行“Build”命令,同样在输出窗口中显示提示信息,如图1.7所示。
图1.7 链接后编译输出窗口当项目设置改变或项目中许多文件被修改,可以直接执行“Build”→“Rebuild All”菜单命令,
该命令将彻底重新编译链接整个项目。
1.2.5 运行程序程序编译并链接成功后,可以执行“Build”→“Execute”菜单命令或者按快捷键【Ctrl+F5】来运行程序。系统已自动将ConsolePro.exe放在“Execute”菜单命令后。
由于创建的是控制台程序,所以运行时系统将打开一个DOS窗口,运行结果如图1.8所示。
图1.8 程序运行结果
1.2.6 调试程序程序调试是程序开发中的重要环节,如果程序中出现逻辑错误,即使编译通过,也不能得到正确的结果。只有通过调试(Debug)才能查出程序设计上的深层问题,也可以检查代码执行效率,优化代码质量。
Visual C++6.0提供了动态调试功能,该功能可以一步步跟踪程序的执行流程,并检查变量值的变化情况。下面就简单介绍动态调试程序的方法。
1,单步执行单步执行就是一条一条语句地执行,每执行完一行语句,程序就暂停下来,以便调试者观察程序的执行状况。
按下快捷键【F10】或者【F11】,系统就处于单步执行状态,开始单步执行。对于本程序而言,
就从main()函数开始执行。
每按一下【F10】或者【F11】键,程序就执行一步(一行)。处在单步执行状态时,有一个黄色的箭头,指示将要执行的语句。单步执行时,在编辑窗口的下方会自动出现Variables窗口和Watch窗口,如图1.9所示。
20
励志照亮人生 编程改变命运零基础学 Visual C++
图1.9 单步调试程序界面
Variables窗口:Variables窗口中的Auto选项卡用于显示与当前正在执行语句有关的变量名和其当前值;Locals选项卡用于显示当前函数内所有变量的变量名和其当前值。如果需要,用户可以双击Variables窗口中显示的某个变量的Value域,人为地修改该变量的当前值继续调试下面的程序。
Watch窗口:在Watch窗口中,可以添加需要长期观察取值情况的变量名。双击Watch窗口中的
Name域,进入编辑状态,输入要察看的变量名,即可将该变量加入察看窗。用户可以通过观察这些变量的当前值,判断程序的执行状态。
快捷键【F10】和【F11】的区别在于,使用快捷键【F10】时,系统会把函数调用当作一条语句执行;而使用快捷键【F11】时,如果遇到函数的调用,则进入被调用函数内部,继续单步执行。快捷键【F10】和【F11】可以交替使用。
如果需要中途终止动态调试状态,执行“Debug”→“Stop Debugging”菜单命令,或者按下
【Shift+F5】快捷键即可。
2,设置断点执行采用单步执行的方法调试程序有时太慢,如果能够判断出逻辑错误的大致位置,就可以在程序中设置程序断点进行动态调试。
断点是用户在程序中设置的,能够使程序暂时中断执行的标志。执行时,如果没有遇到断点,程序将连续执行,遇到断点,程序就暂停执行。
(1)设置/取消断点在编辑区,将插入点光标定位于需要检查程序执行情况的语句,按下【F9】键,就完成了断点的设置,这行语句就是一个断点。程序中可以设置多个断点,凡是设置成断点的语句,其左侧都会显示
21
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建
22
励志照亮人生 编程改变命运零基础学 Visual C++
一个紫红色的圆点。
将插入点光标定位于已经设置了断点的语句内,按下【F9】键,就可以取消该断点。
(2)在断点之间运行程序设置断点之后,按下快捷键【F5】,程序开始执行。当遇到第一个断点时,暂停执行,此时该语句的左侧同样会显示一个黄色的指示箭头,在编辑窗口的下方会自动出现Variables窗口和Watch窗口,
如图1.10所示。在其中可以察看程序的执行情况。
图1.10 设置断点调试程序界面再次按下【F5】键,程序就从当前断点处继续执行,直到遇到下一个断点,再次暂时中断运行,
此时又可以察看程序的执行情况了。当然,如果没有遇到断点,程序会一直执行下去,直到执行完毕。
说明如果在循环体内设置了断点,则每次循环执行到此断点,程序便暂停运行。
当然,用户也可以在执行到断点处之后,变化调试方式,采样单步执行。实际上,单步执行和设置断点执行两种动态调试方法交替使用,能够更快地找到程序中的逻辑错误。在实际程序的动态调试时,一般都是交替地使用【F5】、【F10】和【F11】快捷键。
1.3 MFC应用程序框架
Visual C++6.0一个最主要用途就是基于MFC的Windows应用程序的设计,这也是本书的重点。
MFC提供了构造Windows应用程序的框架,它不仅为应用程序建立标准的结构,生成一系列起动文件,还提供标准的图形用户界面如菜单、工具栏、状态条等供开发人员在程序中补充完善,开发人员只需要完成针对特定应用的代码。使用应用程序框架的应用程序代码小,运行速度快,它提供的工具也降低了编码的难度。
1.3.1 基于对话框的应用程序框架
MFC Windows应用程序框架主要有两种类型:基于对话框的应用程序框架和基于文档/视图结构的应用程序框架。平时所见到的大多数Windows
应用程序均属于这两种框架。在本节简要介绍一下基于对话框的应用程序框架的创建。
(1)启动Visual C++6.0,执行“File”→
“New”菜单命令,在“New”对话框的“Projects”
选项卡左侧的项目列表中,选中“MFC
AppWizard(exe)”。
(2)在“Project name”文本框中键入项目的名称“DialogbaseDemo”,在“Location”文本框中指定所要创建的项目的位置(文件夹)。
(3)单击“OK”按钮,在弹出的“MFC
AppWizard step1”对话框中,选中“Dialog based”
单选框后,单击“Next”按钮,如图1.11所示。
(4)此时会出现“MFC AppWizard step2”对话框,在其中也包含一些选项,这里采用默认的设置,单击“Next”按钮,出现“MFC AppWizard
step3”对话框,依次类推均采用默认的设置。
(5)在最后出现的“New Project Information”对话框中,单击“OK”按钮,项目即创建成功。
项目创建成功后,在工作区窗口会发现自动生成了一些相关类和资源,在资源编辑窗口显示的则是自动生成的对话框的界面,如图1.12所示。
图1.12 AppWizard生成的基于对话框的MFC项目
23
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建图1.11,MFC AppWizard step1”对话框窗口
24
励志照亮人生 编程改变命运零基础学 Visual C++
用户可以在此基础上添加、修改、设计资源,完善功能设计,这在后面的章节中会有详细地介绍。
执行“Build”→“Execute”菜单命令(或快捷键
【F7】)编译工程,而后直接使用快捷键【Ctrl+F5】运行程序,程序的运行结果如图1.13所示。
生成的程序只是带有“确定”和“取消”按钮的一个空对话框窗口,单击“确定”或“取消”按钮,将退出对话框窗口。
此时,在工程DialogbaseDemo目录下会生成一个
Debug子目录,在该子目录中包含有项目生成的可执行文件“DialogbaseDemo.exe”。
说明基于对话框的MFC应用程序框架的创建及其结构在本书的第11章会有详细介绍。
1.3.2 基于文档/视图结构的MFC应用程序基于文档/视图结构的应用程序是最常见的Windows应用程序结构,如常用的Word、Excel等软件均是采用这种结构。其典型特征是应用程序界面由框架窗口、客户窗口、菜单栏、工具栏和状态栏等组成。
使用Visual C++6.0的AppWizard可以创建两种类型的基于文档/视图结构的应用程序框架:单文档
(Single Document Interface,SDI)和多文档(Multiple Documents Interface,MDI)。本节将简单介绍一下使用AppWizard创建单文档MFC应用程序的过程。
(1)启动Visual C++6.0,执行“File”→“New”菜单命令,在“New”对话框的“Projects”选项卡左侧的项目列表中选中“MFC AppWizard(exe)”。
(2)在“Project name”文本框中键入项目的名称
“SDIDemo”,在“Location”文本框中指定所要创建的项目的位置(文件夹)。
(3)单击“OK”按钮,在弹出的“MFC AppWizard
step1”对话框中,选中“Single document”单选框后,
单击“Next”按钮,如图1.14所示。
(4)与创建基于对话框的MFC程序类似,接着会出现一系列的设置向导对话框,对生成程序的相关特性进行设置,这里均采用默认设置。在最后出现的“New
Project Information”对话框中,单击“OK”按钮,程序即创建成功。
程序创建成功后,在工作区窗口会发现自动生成了一些相关类和资源,如图1.15所示。
用户可以在此基础上完善功能设计,这在后面的章节中会有详细地介绍。
执行“Build”→“Execute”菜单命令(或按快捷键【F7】)编译程序,而后直接使用快捷键
【Ctrl+F5】运行程序,程序的运行结果如图1.16所示。
同样,此时在工程SDIDemo目录下会生成一个Debug子目录,在该子目录中包含有项目生成的可执行文件“SDIDemo.exe”。
图1.13 对话框项目运行结果图1.14,MFC AppWizard step1”对话框窗口
25
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建图1.15 AppWizard生成的基于单文档的MFC项目图1.16 单文档项目运行结果说明基于文档/视图结构的MFC应用程序框架的创建及其结构在本书的第10章会有详细介绍。
1.3.3 文档/视图结构简介文档/视图结构是在Visual C++中使用MFC开发基于文档的应用程序的基本框架,在这个框架中,
数据的维护及其显示是分别由两个不同,但又彼此紧密相关的对象—文档和视图负责的。
文档是一个应用程序数据基本元素的集合,它构成应用程序所使用的数据单元,另外它还提供了管理和维护数据的手段。
视图是数据的用户窗口,为用户提供了文档的可视的数据显示,它把文档的部分或全部内容在窗口中显示出来。视图还给用户提供了一个与文档中的数据交互的界面,它把用户的输入转化为对文档中数据的操作。
每个文档都会有一个或多个视图显示,一个文档可以有多个不同的视图。比如,在Excel电子表格中,我们可以将数据以表格方式显示,也可以将数据以图表方式显示。
文档和视图的关系可简单表示为如图1.17所示。
26
励志照亮人生 编程改变命运零基础学 Visual C++
说明可将文档比作一个文件袋,专门用于保存文件数据,需要看时从文件袋(文档)中取出来,放到桌面(视图)上查看。
下面以上节生成的单文档应用程序“SDIDemo”为例,
简单分析一下程序框架的结构及工作过程。
在工程“SDIDemo”中,系统共生成了五个类,其功能如下。
CAboutDlg:对话框类,即对应应用程序执行“帮助”→“关于”菜单命令后,弹出的“关于”对话框。
CSDIDemoApp:派生自应用程序类CWinApp,为应用程序对象,负责应用程序的初始化和退出清理工作。
CMainFrame:派生自CFrameWnd类,为框架窗口对象,对应应用程序的主窗口。
CSDIDemoDoc:派生自CDocument文档类,为文档对象,储存与应用程序相关的数据。其在应用程序中没有直观的对应关系。
CSDIDemoView:派生自视图类CView,为视图对象,对应应用程序的客户窗口,用来显示文档数据的内容。
对应用程序而言,视图是程序窗口的客户区,框架窗口是客户区的框架,程序数据显示在视图窗口,用户通过视图与程序交互。同时,文档、视图和框架三者之间相互关联、相互协调,彼此都包含了指向对方的指针。文档、视图与框架的关系,如图1.18所示。
图1.18 文档、视图与框架的关系
1.4 VC++程序的工程文件与开发过程前面几节介绍了使用Visual C++6.0集成开发环境开发应用程序的一般过程,本节将从总体上介绍图1.17 文档、视图关系视图文档当前可见的文档部分应用程序对象文档对象框架窗口对象可向框架对象发送消息可向视图对象发送消息视图对象可实现双向数据交换一下VC++程序的工程文件以及MFC应用程序的生成过程。
1.4.1 VC++程序的工程文件利用Visual C++6.0创建的工程中包含了框架程序所有的类、全局变量的声明与实现,以及所用到的所有资源。在Windows资源管理器中打开工程“SDIDemo”的工程目录,会发现其中有20个文件和两个目录—res和debug。
说明
res目录用于存放工程的资源文件,Debug目录用于存放编译、链接时产生的中间文件和最终生成的可执行文件。
一般来讲,使用Visual C++6.0 AppWizard创建的工程,其包含的文件包括4部分:工作区和工程文件、应用程序的源文件和头文件、资源文件和预编译的头文件。
在实例工程“SDIDemo”中,其包含的主要文件及作用如表1.3所示。
表1.3,SDIDemo”工程包含的主要文件及作用文件类别文件名说明工作区和
SDIDemo.dsw
开VC开发环境生成的工作区(Workspace)文件,包含当前工作区的工程信息工程文件
SDIDemo.dsp
开VC开发环境生成的工程文件,包含当前工程的设置,包含的文件等信息
SDIDemo.clw开类向导(ClassWizard)生成的用来存放类信息的文件
SDIDemo.h开CSDIDemoApp类的头文件
SDIDemo.cpp
开CSDIDemoApp类的源文件,它将创建CSDIDemoApp类的一个对象,
并覆盖InitInstance()函数应用程序的源MainFrm.h开CMainFrame类头文件文件和头文件MainFrm.cpp开CMainFrame类的源文件
SDIDemoDoc.h开CSDIDemoDoc类的头文件
SDIDemoDoc.cpp开CSDIDemoDoc类的源文件
SDIDemoView.h开CSDIDemoView类的头文件
SDIDemoView.cpp开CSDIDemoView类的源文件资源文件
Resource.h开工程的头文件,定义了资源ID,供SDIDemo.rc文件使用
SDIDemo.rc
开资源文件,包含了标准的MFC类的资源,如默认的About对话框、菜单、工具栏和快捷键等资源预编译的头文件StdAfx.h、StdAfx.cpp
开VC开发环境把常用的MFC头文件,如afxext.h、afxdisp.h、afxdtctl.h、
afxcmn.h等,都放在StdAfx.h文件中,然后在StdAfx.cpp文件中包含这个头文件,这样StdAfx.cpp文件只编译一次,生成预编译头文件,避免了每次编译时,都重新编译这些常用的MFC头文件
1.4.2 VC++项目的开发过程可见,在Visual C++6.0集成开发环境中开发项目非常容易,一个用C++开发的项目的通用开发过程可以表示为图1.19所示。
27
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建图1.19 C++项目的开发过程简单来说,使用Visual C++6.0集成开发环境开发应用程序的一般过程分为创建项目、编辑代码、
编辑程序、链接程序和运行程序几个阶段,各阶段实现实现的主要功能如图1.20所示。
建立一个项目的第一步是利用编辑器建立程序代码文件,包括头文件、代码文件、资源文件等。然后,启动编译程序,编译程序首先调用预处理程序处理程序中的预处理命令(如#include、
#define等),经过预处理程序处理的代码将作为编译程序的输入。
编译对用户程序进行词法和语法分析,建立目标文件,文件中包括机器代码、连接指令、外部引用以及从该源文件中产生的函数和数据名。此后,连接程序将所有的目标代码和用到的静态连接库的代码连接起来,为所有的外部变量和函数找到其提供地点,
最后产生一个可执行文件。一般有一个makefile文件来协调各个部分产生可执行文件。
可执行文件分为两种版本:Debug和Release。Debug版本用于程序的开发过程,该版本产生的可执行程序带有大量的调试信息,可以供调试程序使用;而Release版本作为最终的发行版本,没有调试信息,并且带有某种形式的优化。
说明选择是产生Debug版本还是Release版本的方法是,在Developer Studio中选择菜单Build|Set Active
Configuration,在弹出的对话框中,选择所要的类型,然后单击“OK”按钮,关闭对话框。
Visual C++6.0集成开发环境中集成了编辑器、编译器、连接器以及调试程序,覆盖了开发应用程序的整个过程,程序员不需要脱离这个开发环境就可以开发出完整的应用程序。
而MFC应用程序相比于控制台应用程序,除了源文件外,还增加了包含菜单、工具栏、对话框等资源信息的资源文件,因此其应用程序的开发、实现过程如图1.21所示。
28
励志照亮人生 编程改变命运零基础学 Visual C++
hello.cpp iostream.h
hello.obj
hello.exe
hello.exe
图1.20 VC程序的开发阶段程序源代码的录入,
生成源程序*.cpp,*.h等编辑编译链接执行语法分析查错,翻译生成目标程序*.obj
运行可执行程序.exe,
完成用户的任务与其他目标程序或库链接装配,生成可执行程序*.exe
Source Header Files
mlibcewq.lib
Makefile
Editor
Preprocessor
Compiler
Object File
LibrariesObject Files
Release VersionDebug Version
Linker
图1.21 MFC应用程序开发过程
29
励志照亮人生 编程改变命运第2 章Visual C++6.0基本应用程序的创建应用程序向导集成开发环境资源编辑器编译资源编译应用程序类向导
.obj,res
Create
Build
.DEF,CPP,DSW
.H,DSP
源文件
.ICO,RC,BMP
资源文件