• 1. Windows 编程实践包飞龙 csfeilong@imu.edu.cn 计算机学院305室
  • 2. 引言 Windows 编程基础知识 Microsoft Windows是应用于微机上的图形化用户界面的操作系统。它为应用程序提供了一个由一致的窗口和菜单结构构成的多任务环境。 Windows应用软件开发平台: Windows语言的源程序编辑器和编译器。 程序调试工具,包括源程序语法检查、可执行程序修改和运行监视等。 资源管理器,包括图像化窗口及组成元素的多种对象的编辑器。 可选择并构成具体语句或源程序结构的例程库及帮助文件。 应用程序帮助文件和安装开发工具包。 其他功能。
  • 3. 在Windows编程中“对象”是指Windows的规范部件,包括各种窗口、菜单、按钮、对话框及程序模块等,这些多样化的“对象”能够充分满足构成应用软件操作界面的需要,因此编写Windows程序相当一部分工作是在创建对象和为对象属性赋值。 可视化开发平台给出了许多选用的对象,程序员可以选择所需要的对象并为对象的属性确定参数值,由此搭建起应用程序的“大框架”。在这个“大框架”中,程序员需要进一步编写必要的细节代码段,最后构成完整的应用程序。
  • 4. 在用Visual C++开发面向对象应用程序时,主要使用了两种方法: 使用Windows提供的Windows API函数 API是应用程序编程接口的缩写,是系统和应用程序间的接口。它为应用程序提供系统的各种特殊函数及数据结构定义。根据完成的功能,分类如下: 窗口管理函数:实现窗口的创建、移动和修改功能。 图形设备接口函数:实现与设备无关的图形操作功能。 系统服务函数:实现与操作系统有关的多种功能。 直接使用Microsoft提供的MFC类库 MFC类库集成了大量已经预先定义好的类,用户可以根据编程的需要调用相应的类,或者根据需要自己定义有关的类。
  • 5. 几个概念 软件开发 软件开发的过程就是人们使用各种计算机语言将人们关心的现实世界(问题域)映射到计算机世界的过程;    现实世界问题域 → 建立模型(借助某种建模思想) → 编程实现(借助某种编程语言) → 计算机世界执行求解 算法 数据的运算是通过算法(algorithm)描述的。是由若干条指令组成的有穷序列,它必须满足下述准则:    1、输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件。    2、输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的。     3、有穷性:一个算法必须保证执行有限步之后结束。    4、确定性:算法的每一步骤必须确定定义。    5、可行性:算法原则上能够精确地运行。
  • 6. 算法举例 例:设计一个算法,求出n个数中的最大数。 【分析】顺序比较法。即首先把第一个数送入一个变量中,称此变量为比较变量,然后依次取出每一个数同前面所有数中的最大数(已存入比较变量中)进行比较,若此数大于比较变量的值就把它赋给比较变量,使得比较变量的值始终为比较过的所有数中的最大者,当比较完所给的n个数后,比较变量的值就是这n个数中的最大数。算法如下1、  给n输入一个正整数; 2、   设置一个变量x,给x输入n个数中的第一个数; 3、   设置一个计数变量I,给它赋初值1; 4、   设置一个比较变量d,给它赋初值x 5、   给x输入下一个数; 6、   使I增1; 7、   如果x>d则把x值赋给d,否则什么都不做; 8、   如果I
  • 7. 程序 程序设计就是用怎样的数据结构来实现一个算法 ,是可以连续执行,并能够完成一定任务的一条条指令的集合。它是人与机器之间进行交流的语言。 (面向过程)程序=算法+数据结构 (面向对象)程序=对象+消息
  • 8. 第1章Visual C++ 6.0开发环境 1.1开发环境概述 1.2开发环境的菜单功能 1.3开发环境的工具栏 1.4项目和项目工作区 1.5资源 1.6一个控制台应用程序 1.7程序调试
  • 9. 1.1开发环境概述 界面由标题栏、菜单栏、工具栏、项目工作区窗口、文档窗口、输出窗口以及状态栏等组成,如图。 图1.2 Visual C++ 6.0开发环境工具栏菜单栏项目工作区窗口输出窗口编辑区输出窗口标签标题栏状态栏
  • 10. 1.2开发环境的菜单功能 1.2.1 File菜单 File菜单中的命令主要用来对文件和项目进行操作。如图是File菜单中的各条命令,其中各项命令的功能描述如表。 图1.3 File菜单
  • 11. 1.2开发环境的菜单功能1.2.2Edit菜单 Edit菜单中的命令是用来使用户便捷地编辑文件内容,如图,其中的各项命令的快捷键及它们的功能描述如表。 图1.4 Edit菜单
  • 12. 1.2开发环境的菜单功能1.2.3View菜单 View菜单中的命令主要用来改变窗口和工具栏的显示方式,激活调试时所用的各个窗口等。如图,其中的各项命令的功能描述如表。 图1.5 View菜单
  • 13. 1.2开发环境的菜单功能1.2.4 Insert菜单 Insert菜单中的命令主要用于项目及资源的创建和添加,如图。表列出了Insert菜单的各项命令的快捷键及它们的功能。 图1.6 Insert菜单
  • 14. 1.2开发环境的菜单功能1.2.5 Project菜单 Project菜单中的命令主要用于项目的一些操作。图所示的是Project菜单中的各个命令。表列出了Project菜单的各项命令的快捷键及功能。 图1.7 Project菜单
  • 15. 1.2开发环境的菜单功能1.2.6Build菜单 Build菜单中的命令主要用来应用程序的编译、连接、调试、运行,如图。表列出了Build菜单的各项命令的快捷键及它们的功能。 图1.8 Build菜单
  • 16. 1.2开发环境的菜单功能1.2.7Tools菜单 Tools菜单中的命令主要用于选择或定制开发环境中的一些实用工具,如图;其中除了Visual C++ 6.0的组件外,其余的各项命令的快捷键及功能描述如表所示。 图1.9 Tools菜单
  • 17. 1.2开发环境的菜单功能1.2.8 Windows菜单 Windows菜单中的命令主要用于文档窗口的操作,如图是Windows菜单中的各条命令,其中的各项命令的快捷键及它们的功能描述如表。 图1.10 Windows菜单
  • 18. 1.2开发环境的菜单功能1.2.9 Help菜单 Visual C++ 6.0 提供了大量详细的帮助信息,而Help菜单便是得到这些帮助信息最有效和最主要的途径。图显示了Help菜单中的各命令项,其中的各项功能如表。 图1.11 Help菜单
  • 19. 1.3开发环境的工具栏 1.3.1工具栏概述 标准工具栏 图1.12 标准工具栏New Text FileCutPasteRedoOutputFind in FilesSearchOpenSave AllCopyUndoWorkspaceWindow ListFind
  • 20. 1.3开发环境的工具栏类向导工具栏 小型编连工具栏 图1.13 WizardBarClassFilterMembersActions图1.14 Build MiniBarCompileStop BuildGoBuildExecute Add/Remove breakpoints
  • 21. 1.3开发环境的工具栏1.3.2工具栏的显示与隐藏 “Customize”对话框方式 (1)  选择“Tools”菜单“Customize”菜单项。 (2) 如图;单击Toolbars标签项,将显示出所有的工具栏名称,那些显示在开发环境上的工具栏名称前面将带有选中标记()。 (3)要显示某工具栏,鼠标左击该工具栏名称,使得前面的复选框带有选中标记;同样的操作再进行一次,工具栏名称前面的复选框的选中标记将去除,该工具栏就会从开发环境中消失。 快捷菜单方式 在开发环境中任何工具栏处右击鼠标,如图。表列出了各个菜单命令的功能。
  • 22. 1.4项目和项目工作区 1.4.1项目基本概念 在VC中,项目中所有的源文件都是采用文件夹的方式进行管理的,它将项目名作为文件夹名,在此文件夹下包含源程序代码文件(.cpp,.h)、项目文件(.dsp)以及项目工作区文件(.dsw)等,下面列出了其他一些文件类型的的含义: .opt 关于开发环境的参数文件,如工具条位置等信息 .aps(AppStudio File) 资源辅助文件,二进制格式 .clw ClassWizard信息文件 .dsp(DeveloperStudio Project) 项目文件 .plg 编译信息文件 .hpj(Help Project) 帮助文件项目 .mdp(Microsoft DevStudio Project) 旧版本的项目文件 .bsc 用于浏览项目信息 .map 执行文件的映像信息纪录文件 .pch(Pre-Compiled File) 预编译文件,可以加快编译速度,但是文件非常大 .pdb(Program Database) 记录程序有关的一些数据和调试信息 .exp 记录DLL文件中的一些信息,只有在编译DLL才会生成 .ncb 无编译浏览文件(no compile browser)
  • 23. 1.4项目和项目工作区 还有相应的Debug或Release、Res等子文件夹。若创建的单文档应用程序项目名是Ex_Sdi,则各文件的布局如图。 VC应用程序向导创建项目时,系统会自动为项目创建Win32 Debug的运行程序,并使用相应的缺省配置。和Win32 Release版本的区别在于:Debug版本的运行程序有相应的调试信息码,Release版本的运行程序没有,但Release版本的运行程序经过代码的优化,其程序的运行速度被最大加速。 注意:在开发环境中,VC是通过左边的项目工作区窗口来对项目进行各种管理。项目工作区窗口包含三个页面,是ClassView页、ResourceView页和FileView页。 图1.18 项目文件的布局Ex_Sdi文件夹Debug或Release 文件夹Res文件夹类文件.cpp,.h 资源文件Ex_Sdi.rc 项目及项目工作区文件 其他文件 编连过程产生的文件 运行文件Ex_Sdi.exe 图标文件Ex_Sdi.ico等 工具栏资源Toolbar.bmp 其他资源Ex_Sdi.rc2等
  • 24. 1.4项目和项目工作区1.4.2 ClassView 用以显示项目中的所有的类信息。假设打开的项目名为Ex_Sdi,单击项目区窗口底部的ClassView,则显示出“Ex_Sdi classes”的树状结点,在它的前面是一个图标和一个套在方框中的符号“+”,单击符号“+”或双击图标,Ex_Sdi中的所有类名将被显示,如CMainFrame、CEx_SdiApp、CEx_SdiDoc、CEx_SdiView等(如图所示)。 图1.19 ClassView图1.20 ResourceView图1.21 FileView
  • 25. 1.4项目和项目工作区1.4.3ResourceView 包含了项目中所有资源的层次列表。每一种资源都有自己使用的图标。 1.4.4FileView FileView可将项目中的所有文件分类显示,如图。 每一类文件在FileView页面中都有自己的目录项(节点)。可以在目录项中移动文件,还可以创建新的目录项以及将一些特殊类型的文件放在该目录项中。 创建一个新目录项,可在添加目录项的地方右击,选择“New Folder”,如图,输入目录项名称和相关的文件扩展名,单击[OK]。 图1.22 “New Folder”对话框
  • 26. 1.5资源 1.5.1资源与资源标识 资源的分类 (1)快捷键列表 (2)工具栏按钮 (3)鼠标指针 (4)对话框 (5)HTML (6)图标 (7)菜单 (8)字符串列表 (9)版本信息 标识符 标识符的命名规则: (1)    在标识符名称中允许使用字母a~z、A~Z、0~9以及下划线。 (2) 标识符名称不区分大小写字母。 (3)    不能以数字开头,如8BIT是不合法的标识符名。 (4)  字符个数不得超过247个。
  • 27. 1.5资源1.5.2资源基本操作 创建资源 (1)从“Insert”菜单选取“Resource”;或用快捷键Ctrl+R打开对话框,如图。[New]用来创建一个由Resource Type列表中指定类型的新资源,[Custom]按钮用来创建Resource Type列表中没有的新类型的资源,[Import]按钮用于将外部已有的位图、图标、光标或其他定制的资源添加到当前应用程序中。 (2)   从Resource Type列表中选择一种资源类型,而后按[New]按钮。 (3) 在项目工作区窗口的ResourceView页面中,看到了刚才选中的资源的缺省标识符,而且相应的资源编辑器自动打开。 图1.23 “Insert Resource”对话框
  • 28. 1.5资源打开资源 如果需要对已有资源进行查看或修改,可以首先切换到项目工作区窗口的ResourceView标签页,然后选中要打开的资源,双击鼠标左键或者按Enter键,这时相应的资源编辑器也会相应自动打开。 删除、复制资源 如果删除一个已有的资源,可以首先切换到项目工作区窗口的ResourceView标签页,然后选中要打开的资源,按Del键或者利用Edit菜单下的Delete菜单项可实现删除。复制资源的过程与删除类似,选中要打开的资源,按住Ctrl键不放,并拖动鼠标左键或利用Edit菜单中的Copy和Paste菜单命令进行操作,它同其他软件的复制过程相同。 保存资源 当设计或修改好一个资源后,用File菜单的Save菜单命令或利用快捷键Ctrl+S将其保存在当前资源文件中。
  • 29. 1.5资源1.5.3资源文件的管理 资源文件一经创建,其中所包含的资源也就随之而定,与资源相对应的标识符也被保存在Resource.h头文件中。 一般,在一个资源文件.RC中所保存的所有资源已经满足的需要了,尽管如此,VC仍然允许用多个文件来存放资源。用View菜单中的Resource Includes菜单命令打开“Resource Includes”对话框(如图1.24所示)时,可以看到Compile-time directives编辑框中已经含有#include "res\Ex_Sdi.rc2"。 1.5.4资源编辑器 所有Windows资源都可以用VC提供的资源编辑器来编辑。 图1.24 “Resource Includes”对话框
  • 30. 1.6一个控制台应用程序 1.6.1用AppWizard创建 用AppWizard创建一个控制台应用程序可按下列步骤进行: (1)  选择“File”“New”菜单命令,显示出“New”对话框。 (2)  选择Projects标签,选中Win32 Console Application项。 (3) 在Project Name框中键入控制台应用程序项目名称。第一次使用时最好确定该项目所在的文件夹以便于源文件的管理,既可在Location下的编辑框中直接键入文件夹名称,也可单击Browse按钮择一个已有的文件夹,如图。 图1.25 在“New”对话框中建立Ex_Hello控制台应用程序
  • 31. 1.6一个控制台应用程序(4)  单击[OK]。如图。选中A simple application项。 (5) 单击[Finish],如图,单击[OK]按钮系统将自动创建此应用程序。 图1.26 选择控制台应用程序类型图1.27 Ex_Hello信息对话框
  • 32. 1.6一个控制台应用程序1.6.2理解程序框架 在项目工作区窗口中只能看到ClassView和FileView标签,如图。切换到FileView页面,可以看到AppWizard为生成了Ex_Hello.cpp、Stdafx.cpp、Stdafx.h以及ReadMe.txt四个文件。 Stdafx.cpp是一个只有一条语句的空文件,Stdafx.h是VC为每个项目配置的用来预编译的文件;ReadMe.txt是VC为每个项目配置的说明文件,包括对AppWizard产生文件类型的说明以及操作的一些技巧;Ex_Hello.cpp是AppWizard产生的“真正”具有实际意义的程序源代码文件,几乎所有的代码都是添加在这个文件中的。 图1.28 Ex_Hello项目工作区内容
  • 33. 1.6一个控制台应用程序1.6.3添加程序代码 (1)    单击项目工作区窗口的ClassView标签项,将显示Ex_Hello类信息。 (2)    单击各目录项前面的“+”号,将所有目录项展开。 (3) 双击main函数名,在文档窗口中显示出main函数体所在的源文件Ex_Hello.cpp,且文本光标已移至此函数名的前面。 (4) 键入下列代码: ... #include // 输入输出操作的头文件 int main(int argc, char* argv[]) { cout<<"Hello world!\n"; return 0; } (5) 用Save All命令项或标准工具栏的Save All按钮将所有文件保存。
  • 34. 1.6一个控制台应用程序1.6.4编译运行 打开Build菜单,选用Build Ex_Hello.exe菜单项或按快捷键F7,系统对Ex_Hello进行编译、连接,同时在输出窗口中在线地显示出编译的内容,当出现Ex_Hello.exe - 0 error(s), 0 warning(s)字样时,表示Ex_Hello.exe可执行文件已经正确无误地生成了。 在Build菜单中选取Execute Ex_Hello.exe命令或按快捷键Ctrl+F5,就可以运行刚刚生成的Ex_Hello.exe,如图。 在Ex_Hello窗口中,“Press any key to continue”是系统自动加上去的 。 图1.29 Ex_Hello运行结果
  • 35. 1.7程序调试 1.7.1修正语法错误 调试最初的任务主要是修正一些语法错误,这些错误包括: (1)    未定义或不合法的标识符,如函数名、变量名和类名等。 (2)    数据类型或参数类型及个数不匹配。 上述错误在编译后,会在Output窗口中列出所有错误项。若将光标移到Output窗口中的错误编号上,按F1键可启动MSDN并显示出错误的内容,从而帮助用户理解错误产生的原因。 为了能使快速定位到错误产生的源代码位置,提供下列一些方法: (1) 在Output窗口中双击某个错误,或将光标移到该错误处按Enter键,则该错误被亮显,状态栏上显示出错误内容,并定位到相应的代码行中,且该代码行最前面有个蓝色箭头标志。 (2)  按F4键可显示下一错误,并定位到相应的源代码行。 (3) 在Output窗口中的某个错误项上,右击鼠标,在弹出的快捷菜单中选择“Go To Error/Tag”命令。 语法错误被修正后,编译时会出现类似“Ex_Hello.exe - 0 error(s), 0 warning(s)”的字样。并不是说,此项目完全没有错误,可能还有“异常”、“断言”等其他错误,而这些错误在编译时是不会显示出来的,只有当程序运行后才会出现。
  • 36. 1.7程序调试1.7.2设置断点 调试的断点可以有下列类型:(1) 位置断点 、(2) 数据断点、(3)条件断点。 快捷方式 三种快捷方式可以设置位置断点: (1)    按快捷键F9。 (2)    在Build工具栏上单击 按钮。 (3) 在需要设置断点的位置右击,选择“Insert/Remove Breakpoint”命令。 图1.30 设置的断点断点标志断点标志程序中断的位置
  • 37. 1.7程序调试使用Breakpoints对话框 (1) 凡是可以使用的断点前均有选中标记(√)。若单击前面的复选框,则该断点被禁止。按钮[Remove]和[Remove All]清除当前选中的断点或全部断点。 (2) 在Location页面中,“Break At”文本框中可以输入断点的名称。单击[Edit Code]可以查看断点位置处的源代码或目标代码。单击[Condition] ,可以输入程序运行中断所需要的表达式条件,从而设置一个条件断点。 (3) 在Data页面中,提供了一种设置数据断点的方法,如图。在Data页面的最上面编译框中,可以键入任何有效的C/C++表达式,它可以是赋值语句,可以是条件语句,可以是单独的一个变量名。在程序运行过程中,若变量的值有所改变,或者条件表达式变成真时,则程序在该断点处中断。 图1.31 “Breakpoints”对话框图1.32 Data页面
  • 38. 1.7程序调试1.7.3启用调试器 选择“Project”菜单“Settings”命令,如图。在调试程序时必须使用Debug版本。通过选择“Debug info”组合框来设置调试选项。含义如表。还可以在“Project Settings”对话框中的“Link”页面中,选中“Generate mapfile”项,使其在编连时产生相应的映射文件。 选择“Build”菜单“Start Debug”子菜单的“Go”、“Step Into”或“Run To Cursor”命令,就可以启动调试器了。 图1.33 “Project Settings”对话框
  • 39. 1.7程序调试1.7.4控制程序运行 当程序开始运行在Debug状态下时,程序会由于断点而停顿下来。这时可以看到有一个小箭头,它指向即将执行的代码。而且,原来的“Build”菜单就会变成“Debug”菜单,如图1.34所示。其中有四条命令Step Into、Step Over、Step Out和Run to Cursor是用来控制程序运行的,其含义是: n   Step Over的功能是运行当前箭头指向的代码(只运行一条代码)。 n  Step Into的功能是如果当前箭头所指的代码是一个函数的调用,则用Step Into 进入该函数进行单步执行。 n Step Out的功能是如果当前箭头所指向的代码是在某一函数内,用它使程序运行至函数返回处。 n Run to Cursor的功能是使程序运行至光标所指的代码处。
  • 40. 1.7程序调试1.7.5查看和修改变量的值 调试器还提供一系列的窗口,用来显示各种不同的调试信息。可借助“View”菜单下的“Debug Windows”子菜单可以访问它们。当启动调试器后,VC的开发环境会自动显示出Watch和Variables两个调试窗口,且Output窗口自动切换到Debug页面,如图。 图1.34 Debug菜单Watch窗口Output窗口Variables窗口
  • 41. 1.7程序调试QuickWatch窗口的使用 用来帮助用户快速查看或修改某个变量或表达式的值。若仅需要快速查看变量或表达式的值,则只需要将鼠标指针直接放在该变量或表达式上,片刻后,系统会自动弹出一个小窗口显示出该变量或表达式的值。 启动调试器后,选择“Debug”“QuickWatch”或按快捷键Shift+F9,如图。 Expression框可以让用户键入变量名或表达式,而后按Enter键或单击[Recalculate],就可以在Current value列表中显示出相应的值。若想要修改其值的大小,则可按Tab键或在列表项的“Value”域中双击该值,再输入新值按Enter键就可以了。 单击[Add Watch]按钮可将刚才输入的变量名或表达式及其值显示在“Watch”窗口中。 图1.36 “QuickWatch”窗口
  • 42. 1.7程序调试Watch窗口的使用 选择“View”“Debug Windows”“Watch”,四个页面:Watch1、Watch2、Watch3和Watch4 ,在每一个页面中有要查看的变量或表达式,可以将一组变量或表达式的值显示在同一个页面中。使用Watch窗口进行操作时,要注意到下面一些技巧: (1)   添加新的变量或表达式 选定窗口中某个页面,在末尾的空框处,单击左边的“Name”域,输入变量或表达式,按Enter键。同时,又在末尾处出现新的空框,如图。 在变量或表达式中右击,选择“Properties”查看其类型。 (2)   修改变量或表达式的值 选中相应的变量或表达式,按Tab键或在列表项的“Value”域中双击该值,再输入新值按Enter键就可以了。 (3)   删除变量或表达式 单击Del键可将当前选定的变量或表达式删除。 图1.37 添加新的变量或表达式空框
  • 43. 1.7程序调试Variables窗口的使用 Variables窗口能快速访问程序当前的环境中所使用的重要变量。选择“View”“Debug Windows”“Variables”,其中有三个页面:  Auto页面 显示出当前语句和上一条语句使用的变量,还显示使用Step Over或Step Out命令后函数的返回值。  Locals页面 显示出当前函数使用的局部变量。  This页面 显示出由This所指向的对象。 Variables窗口还有一个“Context”框,从下拉列表中可以选定当前Call Stack的指令,以确定在页面中显示变量的范围,如图。 图1.38 “Context”框