面向过程-事件驱动编程-消息机制【VC MFC】

面向过程的MS-DOS编程:

传统的DOS程序都有而且只有一个main函数,可以在main函数中调用其它的函数,完成各种各样的功能和过程。所有函数的调用以及执行都是按照用户预定好的顺序进行的。

在面向过程的程序中,整个程序按照一定顺序进行;它是一系列预先定义好的操作序列的组合,且该过程完全占用着CPU,控制整个程序执行的过程。

面向用户的事件驱动编程:

当Windows操作系统出现之后,面向过程的编程方式已经不能满足用户的需求。一方面,随着程序代码量的逐步增大,面向过程编程的开发与维护工作也越来越困难;另一方面,面向过程的程序设计方式只能适合于在单任务的操作系统上运行。因此,必须有一种新的程序设计模式,即事件驱动编程方式。

Windows是一种多任务的操作系统,可以同时运行多个程序。每一个程序都不能独占系统资源,而是共享各种系统资源,比如CPU和存储器等。事件驱动程序恰好适合于Windows的多任务特点。

事件驱动编程方式完全不同于面向过程的程序设计方式,它是由事件的产生来驱动的。事件的产生是随机的、不确定的,没有预定顺序的。因此,各种事件可以以各种不同的、合理的顺序出现,那么,依赖于事件驱动的程序也可以按各种不同的、合理的流程来执行。也正是这一点,使得多个程序共享系统资源成为可能。

事件驱动的程序设计是一种面向用户的程序设计方式。相对于面向过程的程序设计方式来说,事件驱动的程序设计方式是一种被动的程序设计方式。

面向过程的程序需要主动地去查询用户操作,并根据用户操作调用相应的处理函数。而事件驱动的程序设计方式是一种被动的程序设计方式。程序总是处于等待用户输入事件状态,然后被动地等待用户操作;用户的各种操作被称之为事件,事件驱动的程序设计方式需要事先为各种需要处理的事件编写事件响应函数;当某个用户操作产生,即某个事件发生时,相应的响应函数就会被调用。程序取得事件并做出反应,处理完毕并返回后,又处于等待事件状态。

Windows消息机制:

要更好地使用Visual C++进行Windows编程,就需要进一步了解其消息机制。在Windows应用程序中,事件驱动是围绕着消息的产生和处理展开的,消息是对发生的事件的描述信息。消息通知程序有关事件的发生。一条消息包含有消息的名字、标识、消息发生时的一些参数,以及处理这条消息的函数入口指针。

每当用户进行某种操作,比如鼠标单击或键盘按键,就会触发相应的事件。而事件是以消息的方式通知Windows应用程序的。一旦应用程序获得某条消息,就根据消息映射表查找相应消息的响应函数的入口地址,调用该函数处理消息,完成用户预期的功能。

在Windows操作系统中,应用程序主要以窗口的形式存在。窗口是一个可视的人机交互界面,用来接收各种事件,如用户键盘/鼠标事件、外设的请求事件、定时器的请求事件、信号量的请求事件等。因此,它也就成为应用程序控制消息的发送端和接收端。即Windows应用程序是围绕窗口进行的,窗口不仅提供了可视化的应用程序的界面,也是Windows消息的产生和响应的地方。

消息的产生是由于相应的事件被触发;消息的发送以队列形式进行;消息响应遵循一定的顺序。MFC类库为这种消息响应机制提供了完整的处理功能。MFC类库中的很多类都具有处理相应消息的功能。在面向过程的程序设计方式中,对外设,比如鼠标、键盘等的控制是通过轮询方式进行,即分别定时查询这些设备的输入请求来完成的。而在Windows环境中,这些控制是通过消息机制完成的。因此,Windows也被称为“基于事件驱动的、消息机制的”操作系统。消息机制是Windows能进行多任务并发处理的基础,它保证了Windows下同时运行的程序能够协同作业。

在Windows中,应用程序都包含一个消息循环。该消息循环持续反复检测消息队列,查看是否有用户事件消息,这些用户事件消息包括鼠标移动、单击、双击、键盘操作和计时器到达等。

事实上,这些事件首先被Windows系统接收到。当Windows接收到这些事件后,会产生一些相应的描述事件的消息,并且将这些消息分发到相应的应用程序。应用程序接到这些消息后,根据不同的消息查询消息映射,调用其相应的消息响应函数,完成一定的功能与过程。这一系列动作称之为消息响应。

猜你喜欢

转载自blog.csdn.net/LJH_Gemini/article/details/83119416