1、第5章 Windows程序设计,5.1 Windows应用程序设计的特点 5.2 使用Visual C+ 6.0 5.3 窗口、菜单与消息框 5.4 工具条与状态栏,Windows的优点在于:(1)提供了比DOS字符界面更为直观、友好的图形用户界面;(2)可以同时运行多个应用程序,提高了机器的利用率;(3)应用程序具有一致的外观和用户接口,用户只需要熟悉其中一两个程序,就可以依此类推学会使用别的应用程序;(4)具有更好的虚拟内存管理和设备无关特性等。,5.1 Windows应用程序设计的特点,1事件驱动的程序设计 传统的DOS程序主要采用顺序的、关联的、过程驱动的程序设计方法。 它的基本模式如
2、图5.1所示。,事件驱动的程序设计不是由预先定义好的事件的顺序来控制,而是由事件的发生来控制。,2消息循环与输入 消息是一种报告有关事件发生的通知,Windows应用程序的消息来源有以下四种。 (1)输入消息 (2)控制消息 (3)系统消息 (4)用户消息,消息队列是一个系统定义的内存块,用于临时存储消息或把消息直接发给窗口过程。 每个窗口维护自己的消息队列,并从中取出消息,利用窗口函数进行处理。 模式如图5.3所示。,3图形输出 Windows程序不仅在输入上与DOS程序不同,而且在程序输出上也与DOS有很大差别,主要表现为以下几点。 DOS程序独占整个显示屏幕,其他程序在后台等待。而Win
3、dows的每一个应用程序只对屏幕的一部分进行处理。, Windows程序的所有输出都是图形。 Windows下的应用程序使用图形设备接口(GDI)来进行图形输出。 Windows的图形输出是由GDI来完成的。,GDI提供两种基本服务:创建图形输出和存储图像。 GDI识别四种类型的设备:显示屏幕、硬拷贝设备(打印机、绘图机)、位图和图元文件。,4用户界面对象 Windows支持丰富的用户接口对象,包括:窗口、图标、菜单、对话框等。 (1)窗口 窗口是用户界面中最重要的部分。它是屏幕上与一个应用程序相对应的矩形区域,是用户与产生该窗口的应用程序之间的可视化界面。,(2)边框 大部分窗口都有一个边框
4、,用于指示窗口的边界,同时也用来指明该窗口是否为活动窗口(当前窗口)。 (3)系统菜单框 系统菜单框位于窗口左上角,以当前窗口的图标方式显示,用鼠标点一下该图标(或按ALT+空格键);就会弹出系统菜单。,(4)标题栏 标题栏位于窗口的顶部,在其中显示的文本信息用于说明应用程序,一般是应用程序的名字,以便让用户了解正在运行的是哪个应用程序。 (5)菜单栏 菜单栏位于标题栏下方,横跨屏幕,它列出了应用程序所支持的命令。,(6)工具条 工具条一般位于菜单栏下方,在它上面有一组按钮,代表一些最常用的命令。 (7)用户区 用户区是窗口中最大的一块空白矩形区域,用于显示应用程序的输出。,(8)垂直滚动条和
5、水平滚动条 垂直滚动条和水平滚动条分别位于用户区的右侧和底部,它们各有两个方向相反的箭头和一个深色的长度可变的滚动块。 (9)状态栏 (10)图标 (11)光标,(12)插入符 插入符(caret)是一个微小并闪烁的位图,作为一个键盘控制的指针。 (13)对话框 对话框是一种特殊的窗口,它提供了一种接收用户输入、处理数据的标准方法。,(14)控件 在图5 .5中,查找对话框是一个独立的窗口,它显示信息并接收用户的输入。 (15)消息框 消息框是用于给用户一些提示或警告的窗口。图5.6所示的对话框警告用户输入的文件名找不到。,5资源共享 Windows是一个多任务的操作系统,各个应用程序共享系统
6、提供的资源,常见的资源有:字体、对话框控制、对话框、图标、定时器、插入符号、通信端口和电缆线等。,Windows要求每个应用程序必须以能允许与其他应用程序共享Windows资源的方式进行设计,它的基本模式是: 向Windows系统请求资源。 使用该资源。 释放该资源给Windows以供别的程序使用。,6Windows应用程序的组成 (1)C、CPP源程序文件 (2)H、HPP头文件 (3)资源文件,Windows下应用程序的生成同DOS下类似,也要经过编译、链接两个阶段,只是又增加了资源编译过程,基本流程如图5.7所示。,5.2 使用Visual C+ 6.0,本节将简要介绍Visual C+
7、 6.0的集成开发环境Visual Studio及其组件,使用Visual C+ 6.0基础类库MFC编程的一些基础知识。,5.2.1 Visual C+ 6.0可视化集成开发环境 Visual C+ 6.0提供了一个支持可视化编程的集成开发环境Visual Studio,它不仅支持Visual C+,还支持Visual Basic,Visual J+,Visual InterDev等微软系列开发工具,还包含了文本编辑器、资源编辑器、工程编译工具、增量连接器、源代码浏览器、集成调试工具以及在线帮助文档(MSDN)。,可视化技术的特点是把原来抽象的数字、表格、功能逻辑等用直观的图形、图像的形式表
8、现出来。可视化编程是它的重要应用之一。可视化编程是指:在软件开发过程中,用直观的具有一定含义的图标按钮、图形化的对象取代原来手工的抽象的编辑、运行、浏览操作,软件开发过程表现为鼠标点击按钮和拖放图形化的对象以及指定对象的属性、行为的过程。,1项目工作区 在一个项目工作区中,可以处理以下内容: 一个工程(Project)和它所包含的文件。 一个工程的子工程。 多个相互独立的工程。 多个相互依赖的工程。,FileView(文件视图):显示所创建的工程。 ClassView(类视图):显示项目中定义的C+类。 ResourceView(资源视图):显示项目中所包含的资源文件。 InfoView(文档
9、视图):显示联机文档目录表。,单击项目工作区底部的标签可以从一个视图切换到另一个视图。 FileView窗格显示了工程文件和项目工作区中所包含的文件的逻辑关系。 使用FileView可以查看管理文件,包括增加、删除、移动、重命名和拷贝文件等。,ClassView显示所有已定义的类以及这些类中的数据成员、成员变量。 在ClassView中,文件夹代表工程文件名。 展开ClassView顶层的文件夹后,显示工程中所包含的所有的类,如图5.10所示。,ClassView使用图标标识类、类成员和工程中的其他项,图5.11显示了所有的图标和含义。,要想查找某一个变量的参考,可以先将光标定位在该符号处,再
10、按鼠标右键,弹出快捷菜单,如图5.12所示,选择“References”,会显示出此变量的定义处和引用处,如图5.13所示。,2AppWizard AppWizard是一个标准的C+源代码生成器。 由AppWizard生成的程序是一个基本的Windows程序,你可以编译并运行它,但实际上它什么也不做。它只是为增加的那些程序提供功能性的资源和代码作好准备。,3ClassWizard ClassWizard(类向导)是一个交互式工具,用来建立新的类,定制类,把消息映射成类成员函数,或者把控制框映射为类变量成员。,4WizardBar WizardBar(向导工具条)是一个工具条,用于快速访问一些V
11、isual Studio最实用的功能 。 WizardBar工具条包含了三个相关的下拉列表框:类(Class)、过滤器(Filter)和成员(Member),如图5.14所示。 WizardBar最右边的下三角形图标是一个Action Control 。,使用WizardBar,可以实现以下操作: 增加一个新类。 建立一个新的函数或方法。 跳到一个已存在的函数或方法。,5Componet Gallery Componet Gallery(组件画廊)是一个组件库,它存着可以共享和重用的代码。 6.Visual Studio的一些快捷特性 Visual Studio还提供了一些快捷特性,包括:右键
12、菜单、快速访问常用对话框、属性对话框和键盘快捷键等。,5.2.2 创建工程和工作区 项目工作区(Workspace)是一个包含用户的所有相关项目和配置的实体。 工程(Project)定义为一个配置和一组文件,用以生成最终的程序或二进制文件。 Visual Studio提供了一个简单的对话框,如图5.18所示,用来创建项目工作区、工程、文件和其他文档。,1新建工程 在新建一个工程时,可以把它加入到一个已有的项目工作区中,或同时创建一个新的项目工作区。,2新建工作区 在新建工程的同时可以创建一个新的工作区,工作区名可以与该工程相同,但后缀不同,工作区文件名后缀为.dsw。 3增加已有文件到工程中,
13、4打开工作区 选择File菜单中Open Workspace,指定要打开的工作区;或选择File菜单中Recent Workspaces,从最近打开过的工作区列表中选择一个。 5设置当前工程 选择Project菜单中Setting,可以为当前工程设置编译、链接和C/C+等各种选项,如图5.21所示。,5.2.3 Win32开发 Win32平台包括32位的Windows操作系统和软件开发系统Win32 API。API(应用程序接口)指的是一组由操作系统提供的函数。Win32 API是Windows平台上的一个32位的软件开发系统,它让应用程序可以充分利用32位Windows操作系统的能力。,Wi
14、n32支持以下功能: 高性能的抢先式多任务和多线程。 连续的32位地址空间和先进的内存管理。 具有对所有的进程共享的对象,解决了它的安全性问题。 内存映射文件,具有虚存功能。,1抢先式多任务和多线程 Windows是一个多任务操作系统,它提供了可同时运行多个应用程序的能力。Windows的多任务是一种抢先式多任务。 在抢先式多任务操作系统中,所有运行的进程对CPU时间进行共享,每个进程都能访问CPU,并且实现指令的连续执行。,为了在Win32中支持多线程进程结构,Win32在原来Win16的基础上增加了以下功能: 对进程以及线程创建、操纵的支持。 对一个进程内线程之间的同步和同步对象的支持。
15、一个统一的共享机制。,2连续的地址空间和先进的内存管理 3内存映射文件 内存映射文件是从一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数(CreateFileMapping),这样,文件内的数据就可以用内存读/写指令来访问,而不是用ReadFile和WriteFile这样的I/O系统函数,从而提高了文件存取速度。,4.Win32编程的几个基本问题 (1)数据类型 Win32引入了大量新的数据类型,而且为了跟C/C+类型有所区别,都用大写字母书写。,(2)标识符命名 (3)数据类型长度的变化 (4)内存模式变化 (5)类型修饰符 (6)函数的变化,5.2.4 MF
16、C编程 微软基础类库(MFC)是微软为Windows程序员提供的一个面向对象的Windows编程接口 。 微软提供了一个基础类库MFC,其中包含用来开发C+和C+ Windows应用程序的一组类。,MFC可分为两个主要部分:基础类、宏和全程函数。 1MFC基础类 2宏和全程函数 3MFC的优点 4MFC对消息的管理 5消息的发送,6几点注意事项 第一点是,首先要对Windows API有一定的了解,否则无法深入学习MFC。 另一点要注意的是不要过分依赖Wizards。 第三点就是要学会抽象的把握问题,循序渐进。,5.3 窗口、菜单与消息框,5.3.1 创建一个Windows程序 首先利用Vis
17、ual Studio的可视化编程工具AppWizard生成框架程序,然后往里边填写代码即可。,AppWizard是一个自动化程序生成工具,它通过提示用户的一系列对话框,由用户来指定将要生成的应用程序的特性,然后自动生成相应的代码。,5.3.2 AppWizard所创建的文件 标准的AppWizard文件包括: 工作区文件、项目文件和make文件。 应用程序源文件和头文件。 资源文件。 预编译头文件。 按选择项生成的AppWizard文件。,5.3.3 编译和链接Hi程序,5.3.4 应用程序执行机制 1WinMain函数 通常情况下,程序的执行是从main函数开始的。在Windows(MFC)
18、下,对应的函数是WinMain。,2应用程序类 每个应用程序必须从CWinApp派生出自己的应用程序类,并定义一个全局的对象。该应用程序类包含了Windows下应用程序的初始化、运行和结束过程。,3Run成员函数 WinMain在初始化应用程序实例后,调用Run函数来处理消息循环。Run成员函数执行消息循环,检查消息队列中有没有消息。 4关闭应用程序,5.3.5 几种窗口类型 1框架窗口 框架窗口为应用程序的用户界面提供结构框架,它是应用程序的主窗口,负责管理其相关的窗口。,MFC提供三种类型的框架窗口:单文档窗口(SDI)、多文档窗口(MDI)和对话框的窗口。 MFC提供了三个类,Cfram
19、eWnd,CMDIFrameWnd,CMDIChildWnd和CDialog 分别用于支持单文档窗口、多文档主框架窗口、多文档子窗口和对话框 。,2窗口的创建 窗口的创建分两步。第一步是用new创建一个C+的窗口对象,此时只是初始化窗口的数据成员,并没有真正创建窗口。 第二步是创建窗口。CFrameWnd的Create成员函数生成窗口,并将其HWND保存在C+对象的公共数据成员m_hWnd中。,3注册窗口 在一般的Windows C程序中,在它的窗口函数中处理送给一个窗口的消息。 把一个窗口同它的窗口函数联系起来的过程称为注册窗口类。 注册窗口包括为窗口指定一个窗口函数以及设定窗口的光标、背景
20、刷等内容。,4关闭和删除窗口 框架窗口不仅维护窗口的创建,还管理窗口的关闭和删除过程。 5窗口激活 活动窗口必定是一个没有父窗口的顶层窗口,包括框架窗口和对话框。,5.3.6 菜单的使用 菜单编程一般分为三步: 编辑菜单资源,设置菜单属性(包括菜单名和ID)。 用ClassWizard自动映射菜单消息和成员函数。 手工编辑成员函数,加入菜单消息处理代码。,5.3.7 更新命令用户接口消息 一般情况下,菜单项和工具条按钮都不止一种状态,我们经常需要根据应用的内部状态对菜单项和工具条按钮作相应的改变。,5.3.8 快捷菜单 在任何一个对象上按鼠标右键,就会弹出一个与所选当前对象相关的菜单,菜单中列
21、出了一组针对当前对象的操作。,5.4 工具条与状态栏,如图5.41所示,工具条和状态栏是一个完善的Windows应用程序的重要组成部分 。,5.4.1 工具条的可视化设计 在MFC中,工具条的功能由类CtoolBar来实现。工具条资源和工具条类CToolBar是工具条的两个要素。 下面分别讨论这两种创建方法。 1.利用AppWizard自动创建,2手工创建 如果想要再加一个工具条,就不能再用AppWizard自动创建了,只能手工创建。,5.4.2 工具条的编程技术 主要包括命令处理、命令更新、按钮风格和工具条的隐藏/显示等技术。 1命令处理 要使你编写的应用程序的菜单和工具条能执行相应命令,仅为它们指定命令ID是不够的,还必须为每个命令ID定义相应的命令处理函数。,2命令更新 3按钮风格 4工具条的隐藏/显示 通过选择MyToolsBar程序的“查看(V)”菜单的“工具栏(T)”和“状态栏(S)”,可以隐藏/显示工具条和状态栏,此功能是由AppWizard自动实现的。,5.4.3 状态栏的设计与实现 状态栏实际上也是一个窗口,一般分为几个窗格,每个窗格显示不同的信息。AppWizard会为应用程序自动创建一个状态栏,该状态栏包括4个窗格,分别用来显示命令提示信息和大写键、数字键和滚动键的状态。,