使用AppWizard(下)

来源:互联网 发布:ui编程 编辑:程序博客网 时间:2024/06/04 19:14
在上一讲中我们已经学习到了AppWizard的第四个步骤,本讲心铃将紧接着上一讲继续介绍第四步中的高级选项,以及第五步和第六步,当AppWizard生成了源程序后,我们还要试着编译运行它。

·使用MFC AppWizard

在第四步中点击Advanced按钮,又可调出如图6-1和6-2所示的高级选项对话框。

图6-1用于指定文档模板字符串。在上面的两个选项中,“File extension”用于为程序将要处理的文档类型指定一个固定的扩展名,这个扩展名会自动与程序关联起来,也就是说,在资源管理器中双击具有该扩展名的文件时,将会启动该程序来打开指定的文件,如果不指定扩展名,那么程序不会与任何文档类型相关联;“File type ID”是配合文档关联关系在Windows注册表中要新建的一个键的键名,这两个选项都只能使用英文字符,而不能用中文字符。
在下面可以使用中文字符的五个选项中,“Main frame caption”是将要显示在程序主窗口标题条上的内容,而其它四个选项很容易让人产生混淆的感觉,下面心铃举一些例子来说明其含义:
当我们使用Word 97工具条上的新建按钮来创建一个新文件时,Word 97会给新文件取一个缺省的名字“文档x.doc”,其中x是一个自动递增的数字,而“文档”就是“Doc type name”内定义的值,对于单文档程序来说,缺省的文件名中不会自动添加数字。“Doc type name”最长只允许有6个字符,这是为了保证在加上两位数字的情况下文件名仍然符合DOS的“8.3”命名规则。
某些程序能够处理多种类型的文档,当我们使用写字板程序新建一个文件时,首先会弹出一个对话框让用户选择创建哪一种文档,这个对话框中间列出的就是“File new name”指定的内容。
当我们使用“另存为”命令来保存文件时,“Save as”对话框内“保存类型”下拉列表框中显示的便是“Filter name”指定的内容,这也叫做文档类型过滤器。
“File type name”与“File type ID”很相似,主要用在Windows注册表里,我们一般都采用AppWizard提供的缺省值。
由于日程安排程序没有自己的文档类型,因此我们不用在“File extension”中指定一个扩展名,其余几个选项保持缺省值即可。
图6-2用于指定程序主窗口的风格。选中“Use split window”后让主窗口拥有水平和垂直方向上的两个分割条,用户可以在需要的时候把同一个窗口分割成最多四个子视图。“Main frame styles”是一些关于标题条和边框的选项,很容易理解,其中“Minimized”和“Maximized”用于指定窗口在启动时处于最小化还是处于最大化状态,它们是互斥的,同时只能选一个。我们为日程安排程序保持其中的缺省值。
图6-2中变成灰色的“MDI child frame styles”用于选择MDI程序的子窗口的风格,其中各选项的含义与主窗口类似,但效果上有一些细微的差别,朋友们可以自己试验一下。
第四步结束后,我们继续进入图6-3所示的第五步,这一步比较简单,只有三个选项。

图6-3:第五步

第一项是VC6新增加的,所谓“Windows Explorer”类型的程序就是象资源管理器那样,主窗口被分割成左右两个部分,左边为树形视图,右边是列表视图,而“MFC Standard”程序的主窗口只有单一类型的视图。我们为日程安排程序选择“MFC Standard”。

第二项指定是否让AppWizard在生成的源代码中间加上适当的注释,对于初学者来说,这些注释可以帮助理解源代码的含义,因此我们一般都选中它。
第三项用于指定把MFC类库作为动态链接库来使用,还是做为静态库直接连接到程序中去。如果以DLL方式来使用MFC类库,最后生成的可执行文件要小得多,但是要把这个程序拷贝到其它机器上去执行就要稍微复杂一些,如果其它机器上没有安装MFC类库的DLL,那么我们必须自己制作一个安装程序,把这些DLL都打包起来,以便与程序本身一起安装到目标机器上去。如果以静态库方式来使用MFC类库,由于在编译连接时,MFC类库已经与程序合并在一起了,生成的可执行文件就要大一些,但可以很方便地拷贝到其它机器上去运行。由于日程安排程序只是一个例子,我们为它选择DLL方式,如果哪位朋友想把最终的程序拷贝到其它机器上去运行,可以自己学习使用InstallShield来制作安装程序。
终于来到了图6-4所示的最后一步,在这里我们可以看到AppWizard将要生成的一些C++类,其中有视类CScheduleView、应用程序类CScheduleApp、主框架类CMainFrame和文档类CScheduleDoc,它们构成了一个单文档程序的基本框架,在以后的编程工作中,我们将会围绕着这四个类来做很多事情。这四个类中除了主框架类外,其它三个类的类名中间都包含了我们最初为工程取的名字,如果我们对某个类名不满意,可以在图6-4中相应的编辑框中进行修改,另外,存储每个类的头文件名和CPP文件名也是可以改变的。

图6-4:第六步

与其它三个类相比,视类要更为特殊一些,它的基类缺省为CView,但我们可以重新指定它的基类,而其它三个类的基类是不能改变的。CView相当于提供一张白纸给我们,无论要画什么或写什么都要我们从头做起,而CEditView等类事先已具有了很多功能,我们应根据程序的需求,从这些基类中选择一个最适合的,以便减少编程的工作量。心铃在第四讲中介绍过日程安排程序要使用列表视图来显示事件条目,所以我们在这里选择CListView作为CScheduleView的基类。

完成了第六步的选择之后,我们按下“Finish”按钮,AppWizard便会弹出一个对话框,把我们所做的选择概略地列出来,如果没有其它什么需要再改动的地方,我们按下“OK”按钮,AppWizard便会在指定的路径下面生成一大堆的文件,包括头文件、CPP文件、工程定义文件、资源文件等,另外还生成了两个子目录,“Res”内存放了一些图象资源的原始文件,当我们编译连接程序的调试版本时,各种输出文件将存放在“Debug”目录下面,将来编译连接程序的发布版本时,所有输出文件将存放在“Release”目录下。
到现在为止,AppWizard的工作已全部完成了,VC6开发环境中的Workspace窗口内也显示出了新建工程的类信息、资源信息和文件信息,下面我们就来编译连接这个程序。

·第一次编译连接

在VC中编译连接一个工程也叫做建立(Build)工程,建立工程的目的是对工程中所有源代码与资源文件进行处理,最终生成一个可执行文件。我们按下F7热键(对应Build菜单中的“Build Schedule.exe”命令)或工具栏中建立工程的按钮,VC6就开始工作起来了,在Output窗口中的Build一栏内不断输出有提示信息,指示现在进行到哪一步了。建立工程的完整步骤包括:编译资源(Compiling resources)、编译预编译头文件(Output窗口中第一个Compiling)、编译代码模块(第二个Compiling)、产生目标代码(Generating Code)、连接(Link),如果Output窗口内最后一行显示没有任何错误,那么就成功地生成了可执行文件。
不知道大家的电脑速度如何,在一些速度较慢的机器上,完整建立一次工程要花一两分钟的时间,让人等得受不了,不过,很早之前VC就具有了智能化编译功能,它在编译一个模块之前会检查该模块的源代码从上一次编译至今有没有改变,如果没有改变的话,就用不着重新编译一次,只需要在最后连接时把原来的模块连接一下就行了,如果所有源代码都未改变,那么连最后的连接工作都可以省了。我们现在再次按下F7热键,是不是很快就结束了?

图6-5:日程安排程序的初始模样
除了智能化编译外,VC还具有预编译功能。我们在编程时要用到Windows和MFC类库的头文件,这些头文件定义了WIN32 API函数、各种数据类型、宏和类等等,文件数目相当多,有的文件还很大,编译器为了处理这些文件要花不少时间,于是VC对这些头文件进行了一种称为预编译的特殊处理。AppWizard生成了stdafx.h和stdafx.cpp两个文件,它们包含了所有工程必需的标准Windows和MFC头文件,VC在编译stdafx.cpp时,生成了一个庞大的预编译头文件(在本工程中为Debug目录下的Schedule.pch),其它需要使用Windows和MFC头文件的模块只要把stdafx.h包含进去就行了,VC的编译器将会直接使用预编译头文件,而不用重复处理Windows和MFC头文件。

我们已经建立好工程了,现在按下F5热键,开始调试过程(如果在未建立好工程前,直接按下F5,VC会提问是否建立工程),Output窗口内Debug一栏中陆续输出了一些装载程序和动态链接库的信息,过了一会儿,我们就看到了图6-5所示的程序主窗口,这便是AppWizard生成的程序框架的原始模样。

 

完成了这一讲之后,大家是否感觉到一点成功的喜悦?我们已经拥有了我们的第一个完整的程序,虽然它现在还不能完成任何有用功能。在第七讲和第八讲中,心铃将要带领大家来看看AppWizard生成的程序框架到底是些什么东西,各个类的功能如何,它们之间具有什么样的关系。

 

 

 

 

名词释疑:

调试版本(Debug Version)与发布版本(Release Version):VC为每一个工程都提供了两种配置,一种是调试版本,另一种是发布版本。在调试版本配置下,VC在建立工程时将给程序添加不少调试信息,因此生成的程序要大一些,我们可以使用VC内部的调试器对该程序进行调试,调试器也为调试工作准备了很多错误处理机制。在发布版本配置下,生成的程序要小一些,其中没有调试信息,一般情况下我们只能运行它,而无法使用VC内部的调试器对它进行调试。因此,当我们在进行开发时,通常使用工程的调试版本,便于调试,当开发工作结束时,就为程序生成一个发布版本,以便发布给其他用户来使用。
模块(Module:在软件开发过程中,人们通常把较大的程序分割成一个个的模块,每个模块完成一定的功能,它们之间往往能相互调用一些函数,在建立工程时,各个模块的目标代码被连接在一起,构成最终的可执行文件。好的模块分割方案有助于提高工作效率,因为它使得软件的结构变得很清晰。在C/C++语言中,一个C或CPP文件就构成一个模块。
 
原创粉丝点击