1. API与SDK
Windows操作系统提供给应用程序编程的接口(Application Programming Interface简称为API函数)。主要的Windows函数都在Windows.h头文件中进行了声明。
Windows操作系统大约有1000多种API函数,提供的API函数大多是有意义的单词的组合,每个单词首字母大写,如: CreateWindow,从函数的名字上看,它是用来为程序创建一个窗口的。没有必要死记硬背API函数的调用语法和参数信息,能从MSDN中找到所需的信息就可以了,使用次数多了,这些函数自然也就记住了。
我们常说Win32 SDK开发,那么什么是SDK呢。SDK是Software Development Kit,中文译为软件开发包, 即Windows 32位平台下的软件开发包,包括了API函数、帮助文档、微软提供的一些辅助开发工具。如开发呼叫中心,在购买语音卡时,厂商提供语音卡SDK开发包,方便我们对语音卡的编程操作。这个开发包会包含语音卡的API函数库、帮助文档、使用手册、辅助工具等资源。
提示:API和SDK是一种广泛使用的专业术语,并没有专指某一种特定的API和SDK,例如,语音卡API、语音卡SDK、Java API、Java SDK等。
2. 窗口和句柄
窗口,一个Windows应用程序至少要有一个窗口,称为主窗口。窗口是屏幕上的一块矩形区域,是Windows应用程序与用户进行交互的接口。窗口可以有一个父窗口,有父窗口的窗口称为子窗口。利用窗口,可以接收用户的输入,以及显示输出。
在应用程序中,窗口是通过窗口句柄(HWND)来标识的。要对某个窗口进行操作,首先要得到这个窗口的句柄(HANDLE)。在Windows程序中,有各种各样的资源(窗口、图标、光标等),系统在创建这些资源时会为它们分配内存,并返回标识这些资源的标识号,即句柄。例如:图标句柄(HICON )
3. 消息和消息队列
Windows程序设计是一种事件驱动方式的程序设计模式,主要是基于消息的。例如,当用户在窗口中画图时,按下左键,操作系统会感知这一事件,并将这一事件包装成一个消息,投递到应用程序的消息队列中,然后应用程序从消息队列中取出消息并进行响应。在这个处理过程中,操作系统也会给应用程序“发送消息”。所谓“发送消息”,实际上是操作系统调用程序中一个专门负责处理消息的函数,这个函数称为窗口过程。
消息
在Windows程序中,消息是由MSG结构体来表示的。MSG结构体的定义如下(参见MSDN):
typedef struct
tagMSG {
HWND hwnd
;
UINT message
;
WPARAM wParam
;
LPARAM lParam
;
DWORD time
;
POINT pt
;
} MSG;
第一个成员变量
hwnd
表示消息所属的窗口,一个消息一般都是与某个窗口相关联的。例如,在某个窗口中按下鼠标左键,产生的按键消息就是发给该窗口的。
第二个成员变量message指定了消息的标识符。消息是由一个数值来表示的,不同的消息对应不同的数值。消息对应的数值定义为WM_XXX宏(WM是Window Message),XXX对应某种消息的英文拼写的大写。例如,鼠标左键按下消息是WM_LBUTTONDOWN,键盘按下消息是WM_KEYDOWN,字符消息是WM_CHAR等。
提示:WM_XXX消息对应的具体数值,可在VC++开环境中选中WM_XXX,单击右
键,弹出菜单中选goto definition,即可看到该宏的定义。
第三、第四个成员变量wParam和lParam,用于指定消息的附加信息。
例如,当我们收到一个字符消息的时候,message成员变量的值就是WM_CHAR,但用户到底输入的是什么字符,那么就由wParam和lParam来说明。wParam、lParam表示的信息随消息的不同而不同。这两种类型实际上就是unsigned int和long的宏定义。
最后两个变量分别表示消息投递到消息队列中的时间和鼠标的当前位置。
消息队列
每一个Windows应用程序开始执行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口的消息。例如,当按下左键时,会产生WM_LBUTTONDOWN消息,系统会将这个消息放到窗口所属的应用程序的消息队列中,等待应用程序的处理。Windows将产生的消息依次放到消息队列中,而应用程序则通过一个消息循环不断地从消息队列中取出消息,并进行响应。
进队消息和不进队消息
Windows程序中的消息可以分为“进队消息”和“不进队消息”。进队的消息将由系统放入到应用程序的消息队列中,然后由应用程序取出并发送。不进队的消息在系统调用窗口过程时直接发送给窗口。不管是进队消息还是不进队消息,最终都由系统调用窗口过程函数对消息进行处理。