事件(消息)驱动的程序设计
Windows与事件驱动的程序设计Window简介事件驱动的程序结构基于Windows API的过程式的事件驱动程序设计基于Windows API的程序设计资源(Resource)面向对象的事件驱动程序设计API面临的问题Windows应用程序中的对象基于应用框架的事件驱动程序设计
Windows与事件驱动的程序设计
Window简介
- Windows是一种基于图形界面的多任务操作系统。
- 系统中可以同时运行多个程序。
- 每个程序通过各自的“窗口”与用户进行交互。
- 用户通过鼠标的单击/双击/拖放、菜单选择以及键盘输入来与程序进行交互。
- Windows的功能以两种方式提供使用:
- 工具(程序):资源管理器、记事本、画图、......,供用户(人)使用。
- 函数库:以C语言函数形式出现(在windows.h等头文件中申明),作为应用程序接口(API),供Windows应用程序(运行在Windows系统上的应用程序)使用。
事件驱动的程序结构
- Windows应用程序采用的是一种事件(消息)驱动的交互式流程控制结构:
- 程序的任何一个动作都是由某个事件激发的。
- 事件可以是用户的键盘、鼠标、菜单等操作。
- 每个事件都会向应用程序发送一些消息。例如:
WM_KEYDOWN/WM_KEYUP(键盘按键) WM_CHAR(按键有对应的字符) WM_LBUTTONDOWN/WM_LBUTTONUP/WM_LBUTTONDBLCLK/WM_MOUSEMOVE (鼠标按键) WM_COMMAND(菜单选取) WM_PAINT(窗口内容刷新) WM_TIMER(设置的定时器时间到了)
- 每个应用程序都有一个消息队列。
- Windows系统会把属于各个应用程序的消息放入各自的消息队列。
- 应用程序不断地从自己的消息队列中获取消息并处理之。
- “取消息-处理消息”的过程称为消息循环。
- 当取到某个特定消息(如:WM_QUIT)后,消息循环结束。
- 每个窗口都有一个消息处理函数。
- 大部分的消息都关联到某个窗口。
- 应用程序取到消息后将会去调用相应窗口的消息处理函数
注意:每个消息的处理时间不宜太长,否则会造成程序“假死”现象(程序不响应其它消息)。
基于Windows API的过程式的事件驱动程序设计
基于Windows API的程序设计
- 每个Windows应用程序都必须提供一个主函数WinMain,其主要功能是:
- 注册窗口类(定义程序中要创建的窗口类型):
- 窗口的基本风格、消息处理函数、图标、光标、背景颜色以及菜单等。
- 每类窗口(不是每个窗口)都需要注册。
- 根据注册的窗口类创建应用程序的主窗口(程序的其它窗口等到需要时再创建)。
- 进入消息循环,直到接收到WM_QUIT消息时,消息循环结束。
资源(Resource)
- 每个Windows应用程序,除了程序代码外,还包含用到的一些资源的描述:
- 菜单:菜单ID、菜单项ID/显示文字。
- 对话框:对话框ID和尺寸;对话框中各个控件的ID、类型、尺寸与位置等。
- 资源的描述有规定的格式,存储在相应的资源文件(.rc)中,经编译后将作为Windows应用程序的一部分被链接到应用程序的目标文件中。
面向对象的事件驱动程序设计
API面临的问题
- 基于Windows API来开发事件驱动的应用程序属于过程式程序设计范式。它的不足之处:
- 通过调用API函数编写程序的粒度太细、太繁琐,开发效率不高。
- 如何以更大粒度的程序元素(如,类/对象)来开发事件驱动的应用程序?
Windows应用程序中的对象
- 窗口对象
- 显示程序的处理数据。
- 处理Windows的消息、实现与用户的交互。
- 窗口对象类之间可以存在继承和组合关系。
- 文档对象
- 管理在各个窗口中显示和处理的数据。
- 文档对象与窗口对象之间可以存在1:1和1:n的关系。
- 应用程序对象
- 管理属于它的窗口对象和文档对象。
- 实现消息循环。
- 它与窗口对象及文档对象之间构成了组合关系。
基于应用框架的事件驱动程序设计
- 虽然MFC和Qt提供了以面向对象的方式进行Windows应用程序开发所需要的类,但如何使用这些类来构建和组织程序,往往还要做很多的工作,并且比较灵活,有时不太容易把握。
- 应用程序框架(简称应用框架)是一种通用的、可复用的应用程序结构,该结构规定了程序应包含哪些组件以及这些组件之间的关系,它封装了程序处理流程的控制逻辑。
- 通过复用应用框架,使得应用的开发速度更快、质量更高、成本更低。
- 在一个应用框架中,各个组件以及它们之间的关系是固定的,应用的开发者通过给各组件添加具体的业务代码来实现不同的应用。
- 应用框架有很多,例如:
- 基于MFC的“文档-视”结构的应用框架
- 基于Qt的“模型-视”结构的应用框架