窗口
窗口的概念很轻易了解,就是我们运用软件时看到的界面。Windows 的中心就是窗口,它是Windows一统PC操作零碎市场的杀手锏,如下图所示:
\"\"
图1:记事本程序
我们运用的软件都有本人的窗口,比方 QQ、盘算器、记事本等。这些窗口可以包括输出框、下拉菜单、单选按钮、多选按钮、文本区域等各类各样的控件(Controls),有的乃至还有动画!
窗口、控件、图像、音频视频等都称为资本(Resource),在程序中都可以运用、创立、添加、修正等。
句柄
在Windows编程中,分歧窗口、控件、图像等都对应一个独一的数字(初学者可以了解为 ID),称为句柄(Handle)。经过句柄,程序可以获取对应资本的各类信息,也可以运用、修正、删除该资本。
你可以将句柄了解为学号,你不需求记住先生的姓名、住址、成果等各类信息,当你需求理解这逻辑学生时,只需去教务处,将学号(句柄)通知那边的任务人员(Windows),他就可以帮你找到这个先生。
句柄屏障了许多细节,程序员不需求理解面前的机制。例如用 CreateFile() 函数创立文件后会前往一个文件句柄,然后经过这个句柄就可以读写、删除该文件,而不需求理解Windows是若何将句柄与文件联系关系起来的,也不需求理解句柄究竟保管了哪些信息,Windows 是闭源的,这些面前的细节只要微软晓得。
Windows的音讯机制
在普通的编程中,我们多是经过 API 函数来挪用零碎功用,让操作零碎来帮我们完成许多任务,例如挪用 CreateFile() 函数,操作零碎会帮我们创立一个文件,而不需求我们介入任何任务,十分便利。
反过去,操作零碎也会“偷懒”,会挪用我们程序中的函数,让我们本人处置某些工作。例如用户敲击键盘,操作零碎会起首收到告诉,但它并不会处置,而是挪用程序中的函数,通知程序用户敲击了键盘,你本人处置好了;假如程序不处置,操作零碎才会停止默许的操作。
当然,这不克不及了解为操作零碎“偷懒”,而是给我们一个时机,让我们自行处置某些工作,从而使程序愈加灵敏和强健,也让程序员有了更多发扬的空间。
用户敲击键盘、点击鼠标、拖动窗口、选择菜单、输出文字等一切的操作都称为事情(Event)。这与我们平常了解的“事情”是相似的,都表现发作了某些状况,好的或许坏的。
当有事情发作时,Windows 会生成一条音讯(Message),通知程序发作了什么工作。这与我们平常了解的“音讯”是相似,都表现一种传递信息的载体。
那么,Windows 是若何经过音讯将发作的事情告诉给使用程序的呢?
每当事情发作时,Windows 会生成一条音讯,并放到一个由零碎保护的队列中。然后,程序会本人从这个队列中获撤消息并剖析,挪用事情处置函数(处置事情的代码也就在这个函数中),对用户的操作停止呼应。
队列是一种先辈先出的数据构造,不明确的请自行Google或百度。
留意:Windows 向队列平分派音讯和使用程序从队列中获撤消息并不是同步的,Windows 不论队列中有没有音讯,不论使用程序有没有处置终了,只需有事情发作,就会将音讯丢进队列,什么时分处置终了是使用程序的事。
可见,音讯是衔接 Windows 和使用程序的纽带,Windows 经过音讯通知使用程序发作了什么,使用程序经过音讯晓得该做什么。
音讯构造体
音讯其实是一个构造体,名字为 MSG,界说为:
typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;
Windows 向队列中送达音讯,其实就是将一个类型为 MSG 的构造体变量丢进队列。
MSG 构造体中各成员变量的寄义如下:
1) hwnd表现音讯所属的窗口。用户普通是在程序的窗口下停止操作,所以一个音讯普通多是与某个窗口相干联的。例如在某个运动窗口中按下鼠标左键,发生的按键音讯就是发给该窗口的。
2) message表现音讯类型,是一个数值。在Windows中,音讯是由一个数值来表现的,分歧类型的音讯对应分歧的数值。然则因为数值方便于记忆,所以Windows将音讯对应的数值界说为WM_XXX宏(WM是Window Message的缩写)的方式,XXX 对应某种音讯的英文拼写的大写方式。例如,鼠标左键按下音讯是WM_LBUTTONDOWN,键盘按下音讯是WM_KEYDOWN,字符音讯是WM_CHAR,等等。在程序中我们平日多是以WM_XXX宏的方式来运用音讯的。
3) 第三、第四个成员变量wParam和lParam,用于指定音讯的附加信息。例如,当我们收到一个字符音讯的时分,message成员变量的值就是WM_CHAR,但用户究竟输出的是什么字符,那么就由wParam和lParam来阐明。wParam、lParam表现的信息随音讯的分歧而分歧。
4) 最初两个变量辨别表现音讯送达到音讯队列中的工夫和鼠标的以后地位。
原文地址:https://blog.51cto.com/14591370/2447582