第 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程序主要采用顺序的、关
联的、过程驱动的程序设计方法。
它的基本模式如图 5.1所示。
事件驱动的程序设计不是由预
先定义好的事件的顺序来控制,
而是由事件的发生来控制。
2.消息循环与输入
消息是一种报告有关事件发生的通
知,Windows应用程序的消息来源有以
下四种。
( 1)输入消息
( 2)控制消息
( 3)系统消息
( 4)用户消息
消息队列是一个系统定义的内存块,
用于临时存储消息或把消息直接发给窗口
过程。
每个窗口维护自己的消息队列,并从
中取出消息,利用窗口函数进行处理。
模式如图 5.3所示。
3.图形输出
Windows程序不仅在输入上与 DOS程
序不同,而且在程序输出上也与 DOS有很
大差别,主要表现为以下几点。
① DOS程序独占整个显示屏幕,其他
程序在后台等待。而 Windows的每一个应
用程序只对屏幕的一部分进行处理。
② Windows程序的所有输出都
是图形。
③ Windows下的应用程序使用
图形设备接口( GDI)来进行图形
输出。
Windows的图形输出是由 GDI
来完成的。
GDI提供两种基本服务:创建图
形输出和存储图像。
GDI识别四种类型的设备:显示
屏幕、硬拷贝设备(打印机、绘图
机)、位图和图元文件。
4.用户界面对象
Windows支持丰富的用户接口对象,
包括:窗口、图标、菜单、对话框等。
( 1)窗口
窗口是用户界面中最重要的部分。它
是屏幕上与一个应用程序相对应的矩形区
域,是用户与产生该窗口的应用程序之间
的可视化界面。
( 2)边框
大部分窗口都有一个边框,用于
指示窗口的边界,同时也用来指明该
窗口是否为活动窗口(当前窗口)。
( 3)系统菜单框
系统菜单框位于窗口左上角,以
当前窗口的图标方式显示,用鼠标点
一下该图标(或按 ALT+空格键);就
会弹出系统菜单。
( 4)标题栏
标题栏位于窗口的顶部,在其中显示
的文本信息用于说明应用程序,一般是应
用程序的名字,以便让用户了解正在运行
的是哪个应用程序。
( 5)菜单栏
菜单栏位于标题栏下方,横跨屏幕,
它列出了应用程序所支持的命令。
( 6)工具条
工具条一般位于菜单栏下方,在它上
面有一组按钮,代表一些最常用的命令。
( 7)用户区
用户区是窗口中最大的一块空白矩形
区域,用于显示应用程序的输出。
( 8)垂直滚动条和水平滚动条
垂直滚动条和水平滚动条分别位于
用户区的右侧和底部,它们各有两个方
向相反的箭头和一个深色的长度可变的
滚动块。
( 9)状态栏
( 10)图标
( 11)光标
( 12)插入符
插入符( caret)是一个微小并闪烁
的位图,作为一个键盘控制的指针。
( 13)对话框
对话框是一种特殊的窗口,它提供
了一种接收用户输入、处理数据的标准
方法。
( 14)控件
在图 5,5中,查找对话框是一个独立
的窗口,它显示信息并接收用户的输入。
( 15)消息框
消息框是用于给用户一些提示或警告
的窗口。图 5.6所示的对话框警告用户输入
的文件名找不到。
5.资源共享
Windows是一个多任务的操作系
统,各个应用程序共享系统提供的资
源,常见的资源有:字体、对话框控
制、对话框、图标、定时器、插入符
号、通信端口和电缆线等。
Windows要求每个应用程序必须以
能允许与其他应用程序共享 Windows资
源的方式进行设计,它的基本模式是:
① 向 Windows系统请求资源。
② 使用该资源。
③ 释放该资源给 Windows以供别的
程序使用。
6,Windows应用程序的组

( 1) C,CPP源程序文件
( 2) H,HPP头文件
( 3)资源文件
Windows下应用程序的生成同
DOS下类似,也要经过编译、链接两
个阶段,只是又增加了资源编译过程,
基本流程如图 5.7所示。
5.2 使用 Visual C++ 6.0
本节将简要介绍 Visual C++ 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)。
可视化技术的特点是把原来抽象的数
字、表格、功能逻辑等用直观的图形、图
像的形式表现出来。可视化编程是它的重
要应用之一。可视化编程是指:在软件开
发过程中,用直观的具有一定含义的图标
按钮、图形化的对象取代原来手工的抽象
的编辑、运行、浏览操作,软件开发过程
表现为鼠标点击按钮和拖放图形化的对象
以及指定对象的属性、行为的过程。
1.项目工作区
在一个项目工作区中,可以处理
以下内容:
① 一个工程( Project)和它所包
含的文件。
② 一个工程的子工程。
③ 多个相互独立的工程。
④ 多个相互依赖的工程。
FileView(文件视图):显示所创建
的工程。
ClassView(类视图):显示项目中定
义的 C++类。
ResourceView(资源视图):显示项
目中所包含的资源文件。
InfoView(文档视图):显示联机文
档目录表。
单击项目工作区底部的标签可以从
一个视图切换到另一个视图。
FileView窗格显示了工程文件和项
目工作区中所包含的文件的逻辑关系。
使用 FileView可以查看管理文件,
包括增加、删除、移动、重命名和拷贝
文件等。
ClassView显示所有已定义的类以
及这些类中的数据成员、成员变量。
在 ClassView中,文件夹代表工程
文件名。
展开 ClassView顶层的文件夹后,
显示工程中所包含的所有的类,如图
5.10所示。
ClassView使用图标标识类、类成
员和工程中的其他项,图 5.11显示了
所有的图标和含义。
要想查找某一个变量的参考,可以先
将光标定位在该符号处,再按鼠标右键,
弹出快捷菜单,如图 5.12所示,选择
,References”,会显示出此变量的定义处
和引用处,如图 5.13所示。
2,AppWizard
AppWizard是一个标准的 C++源
代码生成器。
由 AppWizard生成的程序是一个
基本的 Windows程序,你可以编译并
运行它,但实际上它什么也不做。它
只是为增加的那些程序提供功能性的
资源和代码作好准备。
3,ClassWizard
ClassWizard(类向导)是一个交互
式工具,用来建立新的类,定制类,把消
息映射成类成员函数,或者把控制框映射
为类变量成员。
4,WizardBar
WizardBar(向导工具条)是一个工
具条,用于快速访问一些 Visual Studio最
实用的功能 。
WizardBar工具条包含了三个相关的
下拉列表框:类( Class)、过滤器
( Filter)和成员( Member),如图 5.14
所示。
WizardBar最右边的下三角形图标是
一个 Action Control 。
使用 WizardBar,可以实现以下操作:
① 增加一个新类。
② 建立一个新的函数或方法。
③ 跳到一个已存在的函数或方法。
5,Componet Gallery
Componet Gallery(组件画廊)是一
个组件库,它存着可以共享和重用的代码。
6.Visual Studio的一些快捷特性
Visual Studio还提供了一些快捷特性,
包括:右键菜单、快速访问常用对话框、
属性对话框和键盘快捷键等。
5.2.2 创建工程和工作区
项目工作区( Workspace)是一个包
含用户的所有相关项目和配置的实体。
工程( Project)定义为一个配置和一
组文件,用以生成最终的程序或二进制文
件。
Visual Studio提供了一个简单的对话
框,如图 5.18所示,用来创建项目工作区、
工程、文件和其他文档。
1.新建工程
在新建一个工程时,可以把它加入到
一个已有的项目工作区中,或同时创建一
个新的项目工作区。
2.新建工作区
在新建工程的同时可以创建一个新的
工作区,工作区名可以与该工程相同,但
后缀不同,工作区文件名后缀为,dsw。
3.增加已有文件到工程中
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
操作系统的能力。
Win32支持以下功能:
① 高性能的抢先式多任务和多线程。
② 连续的 32位地址空间和先进的内存
管理。
③ 具有对所有的进程共享的对象,解
决了它的安全性问题。
④ 内存映射文件,具有虚存功能。
1.抢先式多任务和多线程
Windows是一个多任务操作系统,它
提供了可同时运行多个应用程序的能力。
Windows的多任务是一种抢先式多任务。
在抢先式多任务操作系统中,所有运
行的进程对 CPU时间进行共享,每个进程
都能访问 CPU,并且实现指令的连续执行。
为了在 Win32中支持多线程进程
结构,Win32在原来 Win16的基础上
增加了以下功能:
① 对进程以及线程创建、操纵的
支持。
② 对一个进程内线程之间的同步
和同步对象的支持。
③ 一个统一的共享机制。
2.连续的地址空间和先进
的内存管理
3.内存映射文件
内存映射文件是从一个文件到一块内
存的映射。 Win32提供了允许应用程序把
文件映射到一个进程的函数
( CreateFileMapping),这样,文件内的
数据就可以用内存读 /写指令来访问,而不
是用 ReadFile和 WriteFile这样的 I/O系统函
数,从而提高了文件存取速度。
4.Win32编程的几个基本问题
( 1)数据类型
Win32引入了大量新的数据类型,而
且为了跟 C/C++类型有所区别,都用大写
字母书写。
( 2)标识符命名
( 3)数据类型长度的变化
( 4)内存模式变化
( 5)类型修饰符
( 6)函数的变化
5.2.4 MFC编程
微软基础类库( MFC)是微软为
Windows程序员提供的一个面向对象的
Windows编程接口 。
微软提供了一个基础类库 MFC,其中
包含用来开发 C++和 C++ Windows应用程
序的一组类。
MFC可分为两个主要部分:基础类、
宏和全程函数。
1,MFC基础类
2.宏和全程函数
3,MFC的优点
4,MFC对消息的管理
5.消息的发送
6.几点注意事项
第一点是,首先要对 Windows API有
一定的了解,否则无法深入学习 MFC。
另一点要注意的是不要过分依赖
Wizards。
第三点就是要学会抽象的把握问题,
循序渐进。
5.3 窗口、菜单与消息框
5.3.1 创建一个 Windows程序
首先利用 Visual Studio的可视化编程
工具 AppWizard生成框架程序,然后往里
边填写代码即可。
AppWizard是一个自动化程序生成工
具,它通过提示用户的一系列对话框,由
用户来指定将要生成的应用程序的特性,
然后自动生成相应的代码。
5.3.2 AppWizard所创建的文

标准的 AppWizard文件包括:
① 工作区文件、项目文件和 make文
件。
② 应用程序源文件和头文件。
③ 资源文件。
④ 预编译头文件。
⑤ 按选择项生成的 AppWizard文件。
5.3.3 编译和链接 Hi程序
5.3.4 应用程序执行机制
1,WinMain函数
通常情况下,程序的执行是从 main函
数开始的。在 Windows( MFC)下,对应
的函数是 WinMain。
2.应用程序类
每个应用程序必须从 CWinApp派生出
自己的应用程序类,并定义一个全局的对
象。该应用程序类包含了 Windows下应用
程序的初始化、运行和结束过程。
3,Run成员函数
WinMain在初始化应用程序实例
后,调用 Run函数来处理消息循环。
Run成员函数执行消息循环,检查消
息队列中有没有消息。
4.关闭应用程序
5.3.5 几种窗口类型
1.框架窗口
框架窗口为应用程序的用户界面提供
结构框架,它是应用程序的主窗口,负责
管理其相关的窗口。
MFC提供三种类型的框架窗口:单文
档窗口( SDI)、多文档窗口( MDI)和
对话框的窗口。
MFC提供了三个类,CframeWnd,
CMDIFrameWnd,CMDIChildWnd和
CDialog 分别用于支持单文档窗口、多文
档主框架窗口、多文档子窗口和对话框 。
2.窗口的创建
窗口的创建分两步。第一步是用
new创建一个 C++的窗口对象,此时
只是初始化窗口的数据成员,并没有
真正创建窗口。
第二步是创建窗口。
CFrameWnd的 Create成员函数生成
窗口,并将其 HWND保存在 C++对象
的公共数据成员 m_hWnd中。
3.注册窗口
在一般的 Windows C程序中,在它的
窗口函数中处理送给一个窗口的消息。
把一个窗口同它的窗口函数联系起来
的过程称为注册窗口类。
注册窗口包括为窗口指定一个窗口函
数以及设定窗口的光标、背景刷等内容。
4.关闭和删除窗口
框架窗口不仅维护窗口的创建,还管
理窗口的关闭和删除过程。
5.窗口激活
活动窗口必定是一个没有父窗口的顶
层窗口,包括框架窗口和对话框。
5.3.6 菜单的使用
菜单编程一般分为三步:
① 编辑菜单资源,设置菜单属性(包
括菜单名和 ID)。
② 用 ClassWizard自动映射菜单消息
和成员函数。
③ 手工编辑成员函数,加入菜单消息
处理代码。
5.3.7 更新命令用户接口消息
一般情况下,菜单项和工具条按钮都
不止一种状态,我们经常需要根据应用的
内部状态对菜单项和工具条按钮作相应的
改变。
5.3.8 快捷菜单
在任何一个对象上按鼠标右键,就会
弹出一个与所选当前对象相关的菜单,菜
单中列出了一组针对当前对象的操作。
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个窗格,分别用来
显示命令提示信息和大写键、数字键和滚
动键的状态。