2.2.2 Windows句柄
并不是每个控件都能接收消息的,只有具有句柄(handle)的控件才能做到。从本质上看,有句柄的控件都是一个窗体(window),既可以独立存在,也可以作为其他控件的容器。没有句柄的控件,例如Label等是不能独立存在的,只能作为窗口控件的子控件,也不能绘制自身,只能靠父窗体将其绘制。
句柄是一个系统自动维护的32位数值,在整个操作系统中这个数值是唯一的。当该句柄代表的窗体被释放后,句柄也随之被释放,这个数值又可能被其他窗体使用。由此可见,句柄的数值是动态的,本身只是一个唯一性标识,操作系统通过句柄来识别和查找它所代表的对象。
并非所有的句柄都是窗体的句柄,在Windows系统中还有很多其他类型的句柄,例如画布句柄(hdc)、画笔句柄、画刷句柄、应用程序句柄(hInstance)等,这些句柄是不能接收消息的。但是无论是哪种句柄,都是系统中对象的唯一标识。
正是因为有了句柄,窗体才能够接收消息。窗体明确了该什么时候绘制自己、绘制子控件,知道了鼠标在什么时候单击了窗口的哪个部分,从而做出相应的处理。句柄就好像是一个人的身份证,有了它,你就可以从事各种社会活动;否则的话,你要么是一个社会看不到的黑户,要么就跟在别人后面,通过别人来证明你的存在。