获取设备句柄的两种方法
=============《Windows 程序设计 第五版》读书笔记 || 第四章 输出文字 =============
获取设备句柄的两种方法
所谓设备句柄,说得通俗一点儿就是要操作的对象,比如一个窗口句柄,一个按钮的句柄。先说说这两种方法的不同之处,其中BeginPaint/EndPaint是重绘整个显示区域,它传回的是一个设备内容句柄,而GetDC/ReleaseDC可以定制重绘区域,它传回的是一个矩形区域。默认情况下,这个矩形区域就是整个显示区域。
(1) BeginPaint/EndPaint
- hdc = BeginPaint(hwnd, &ps)
使用GDI函数
EndPaint(hwnd, &ps)
其中ps是一个PAINTSTRUCT结构,通过BeginPaint函数将重绘所需的各个详细参数保存到ps结构中,要想知道BeginPaint函数获取了哪些信息,就先得了解一下PAINTSTRUCT结构原型:
- typedef struct tagPAINTSTRUCT {
HDC hdc; //设备句柄- BOOL fErase; //若为非零。说明用户背景已被重画过,否则未被重画,大多数为FALSE(0)。
- RECT rcPaint; // 指定要求重画(着色)的矩形区域,RECT结构的四个字段为left、top、right和bottom
- BOOL fRestore; //是Windows自己用的,不关咱程序员的事儿
- BOOL fIncUpdate; //是Windows自己用的,不关咱程序员的事儿
- BYTE rgbReserved[32]; //是Windows自己用的,不关咱程序员的事儿
- } PAINTSTRUCT, *PPAINTSTRUCT;
在这个结构体中,我们要关注的就只有三个结构成员:hdc, fErase和rcPaint,这样就好理解了。在程序中通过断点可以看到ps结构体中各个成员的值(如图1)。
图1
这样一看,就一目了然了。
(2)GetDC/ReleaseDC
- hdc = GetDC (hwnd) ;
- 使用GDI函数
- ReleaseDC (hwnd, hdc) ;
GetDC/ReleaseDC和BeginPaint/EndPaint一样,也是成对儿出现的。其中有个概念需要弄清楚,那就是什么是「无效区域」。Windows内部为每个窗口保存一个「绘图信息结构」,这个结构包含了包围无效区域的最小矩形的坐标以及其它信息,这个矩形就叫做「无效矩形」,有时也称为「无效区域」,也称为「更新区域」。
知道了获取设备内容句柄的两种方法,但只是知道两种方法的不同作用,第二种方法具体怎么用也不太明白,不过在第17章《文字和字体》中应该有详细的讲解。
在讲解这两种方法时,还说到了WM_NCPAINT,这是非显示区域绘制消息,估计做程序皮肤时,就得用这个消息来画窗体标题栏。