句柄,是整个windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个四字节长的数值,来标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是一个指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不用在I/O文件中,它是毫无用处的。 句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来标志很多对象。
在WINDOWS操作系统中,每一个对象都有一个唯一的编号,这个编号就叫句柄,这就好像每个人都有一个名字一样,用以被别人称呼或识别。句柄是给编程的人用的,以便程序员在程序中使用、称呼这个对象。
一个句柄,只有当唯一地确定了一个项目的时候,它才开始有意义。句柄对应着项目表中的一项,而只有WINDOWS本身才能直接存取这个表,应用程序只能通过API函数来处理不同的句柄。举个例子来说吧,比如:我们可以为我们的应用程序申请一块内存块,通过调用API函数GlobalAlloc,来返回一个句柄值:
hMem=GlobalAlloc(......);
其实现在hMem的值只是一个索引值,不是物理地址,应用程序还不能直接存取这块内存。这儿还有一句题外话,是关于操作系统的内存管理的。一般情况下操作系统给应用程序分配的内存块都是可以被移动的或者是可以丢弃的,这样能使有限的内存资源得到充分利用。所以,我们刚开始分配到的那块内存的地址是不确定的,因为它是可以被移动的,所以得先锁定那块内存块,这里应用程序需要调用API函数GlobalLock函数来锁定句柄。如下:
lpMem=GlobalLock(hMem);
这样应用程序才能存取这块内存。
句柄在WIN32下就是一个32位整数。它是WINDOWS用来记录,控制所分配资源的一个控制点。它的英文HANDLE(把手,把柄),可能更能使人明白。比如生成一个窗口,会返回一个窗口句柄。从资源中读入一幅位图,会返回一落千丈个位图句柄。获得了句柄,我们可以用它做许多事。比如用GETOBJECT可以返回WINDOWS中所有有关图形GDI资源的信息。在GETOBJECT中传入位图句柄及位图结构变量,可返加位图的有关信息。有窗口句柄,就可以控制这个窗口的类型,大小等多个方面。API就是应用程序编程接口。可以理解为就是系统为我们提供的函数。我们通过调用API(系统函数)来处理不同的句柄,可以通过调用API来返回句柄值。只要WINDOWS存在,我们就可以对它提供的函数进行调用。
GetDC
函数功能:该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。