按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
解这一切的最好的方式是回过头去,看一看这些内容在SDK编写的应
用程序是如何实现的,然后,再看一看在MFC中是如何把它们一层一
层的与程序员隔离开的。
…………………………………………………………Page 118……………………………………………………………
因此,在本章中介绍相对已 “过时”的Win32 SDK编程,并非是说以
后也使用SDK来编写应用程序,而在于让你通过它们更深入的从MFC的
内部了解MFC,并且,对于某些术语和概念的说明和澄清,也有助于
你以后理解很多的东西。如果你一开始对这些东西不感兴趣,那么,
你可以先暂时跳过此章,继续阅读本书的其它部分。当你对于MFC中
的某些问题感到不解,或者想知道MFC究竟是如何工作的时候,再回
过头来补充这些知识,也是完全可以的。
本章包括以下的内容:
l Windows应用程序的消息处理
l Win32 API和SDK
l WinMain函数
l 窗口和窗口过程
l 32位编程的特点
第一节 事件驱动的应用程序
类似的话已在很多书籍中说过了无数遍,以至于每一个正在或试图进
行Windows编程的人都耳熟能详:Windows应用程序是事件驱动 (或称
作消息驱动)的应用程序。Windows是一个多任务的操作系统,也就是
说,在同一时刻,在Windows中有着多个应用程序的实例正在运行,
比如说这时我正在打开字处理软件Word来编写这本书的书稿,同时,
还打开了Visual C++的集成开发环境Microsoft Developer Studio来
调试书中的示例程序,而且,后台还在放着歌曲。在这样的一个操作
系统中,不可能像过去的DOS那样,由一个应用程序来享用所有的系
统资源,这些资源是由Windows统一管理的。那么,特定的应用程序
如何获得用户输入的信息呢?事实上,Windows时刻监视着用户的一
举一动,并分析用户的动作与哪一个应用程序相关,然后,将用户的
动作以消息的形式发送给该应用程序,应用程序时刻等待着消息的到
来,一但发现它的消息队列中有未处理的消息,就获取并分析该消
息,最后,应用程序根据消息所包含的内容采取适当的动作来响应用
户所作的操作。举一个例子来说明上面的问题,假设我们编了一个程
序,该程序有一个File菜单,那么,在运行该应用程序的时候,如果
用户单击了File菜单,这个动作将被Windows (而不是应用程序本
身 !)所捕获,Windows经过分析得知这个动作应该由上面所说的那个
应用程序去处理,既然是这样,Windows就发送了个叫做WM_MAND
…………………………………………………………Page 119……………………………………………………………
的消息给应用程序,该消息所包含的信息告诉应用程序: “用户单击
了File菜单”,应用程序得知这一消息之后,采取相应的动作来响应
它,这个过程称为消息处理。Windows为每一个应用程序 (确切地说是
每一个线程)维护了相应的消息队列,应用程序的任务就是不停的从
它的消息队列中获取消息,分析消息和处理消息,直到一条接到叫做
WM_QUIT消息为止,这个过程通常是由一种叫做消息循环的程序结构
来实现的。
Windows所能向应用程序发送的消息多达数百种,但是,对于一般的
应用程序来说,只是其中的一部分有意义,举一个例子,如果你的应
用程序只使用鼠标,那么如WM_KEYUP、WM_KEYDOWN和WM_CHAR等消息
就没有任何意义,也就是说,应用程序中事实上不需要处理这些事
件,对于这些事件,只需要交给Windows作默认的处理即可。因此,
在应用程序中,我们需要处理的事件只是所有事件中的一小部分。
图3。1给出了一般Windows应用程序的执行流程。
因此,从某种角度上来看,Windows应用程序是由一系列的消息处理
代码来实现的。这和传统的过程式编程方法很不一样,编程者只能够
预测用户所利用应用程序用户界面对象所进行的操作以及为这些操作
编写处理代码,却不可以这些操作在什么时候发生或者是以什么顺序
来发生,也就是说,我们不可能知道什么消息会在什么时候以什么顺
序来临。
…………………………………………………………Page 120……………………………………………………………
图3。 1 Windows应用程序的基本流程
Windows程序在处理消息时使用了一种叫做回调函数 (callback
function)的特殊函数。回调函数由应用程序定义,但是,在应用程
序中并没有调用回调函数的代码,回调函数是供操作系统或者其子系
统调用的,这种调用通常发生在某一事件发生,或者在窗口或字体被
枚举时。典型的回调函数有窗口过程、对话框过程和钩子函数。其中
的窗口过程和对话框过程将在本章后面的内容中讲述。
第二节 Win32 API和SDK
说到Windows编程,就不能不谈到Windows API (Windows
Application Programming Interface,Windows应用程序编程接
口),它是所有Windows应用程序的根本之所在。简单的说,API就是
一系列的例程,应用程序通过调用这些例程来请求操作系统完成一些
低级服务。在Windows这样的图形用户界面中,应用程序的窗口、图
标、菜单和对话框等就是由API来管理和维护的。
Windows API具有两种基本类型:Win16 API和Win32 API。两者在很
多方面非常相像,但是Win32 API除了几乎包括了Win16 API中的所有
内容以外,还包括很多的其它内容。Windows API依靠三个主要的核
心组件提供Windows的大部分函数,在Win16和Win32 中,它们具有不
…………………………………………………………Page 121……………………………………………………………
同的名称,如表3。1所示。
表3。 1 Win16和Win32 的核心组件
Win16 API Win32 API 说明
USER。EXE USER32。DLL 负责窗口的管理,包括消息、菜单、
光标、通信、计时器和其它与控制窗
口显示
GDI。EXE GDI32。DLL 提供图形设备接口,管理用户界面和
图形绘制,包括Windows元文件、位
图、设备描述表和字体等
KRNL386。EXE KERNEL32。DLL 处理存储器低层功能、任务和资源管
理等Windows核心服务
虽然Win16 API组件带有。EXE的扩展名,但是它们事实都是动态链接
库 (。DLL),不能单独运行。其它一些非核心的Windows API由其它组
件所提供的DLL来实现,这些组件包括通用对话框、打印、文件压
缩、版本控制以及多媒体支持等。
Windows SDK (Windows Software Development Kit,Windows软件开
发工具包)和Windows API紧密联系,它是一套帮助C语言程序员创建
Windows应用程序的工具,在Windows SDK中包括了以下几个组成部
分:
l 大量的在线帮助,这些帮助描述了Windows编程所可能用到的函
数、消息、结构、宏及其它资源
l 各种编程工具,如对话框编辑器及图象编辑器等
l Windows库及头文件
l 使用C语言编写的示例程序
该工具包的最新版本就是我们正在使用的Win32 SDK,在安装了
Visual C++的同时,Win32 SDK也安装到你的计算机上了。尽管MFC提
供了对Win32 API的比较完整的封装,但是,在某些情况下,我们更
倾向于直接调用Win32 API,因为这有时候可以获得更高的效率,并
且有着更大的自由度。而且,使用MFC编写的新风格的Windows应