获取设备句柄的两种方法

=============《Windows 程序设计 第五版》读书笔记 ||  第四章 输出文字 =============

 

    获取设备句柄的两种方法

 

    所谓设备句柄,说得通俗一点儿就是要操作的对象,比如一个窗口句柄,一个按钮的句柄。先说说这两种方法的不同之处,其中BeginPaint/EndPaint是重绘整个显示区域,它传回的是一个设备内容句柄,而GetDC/ReleaseDC可以定制重绘区域,它传回的是一个矩形区域。默认情况下,这个矩形区域就是整个显示区域。


     (1) BeginPaint/EndPaint

  1. hdc = BeginPaint(hwnd, &ps)

  2.   使用GDI函数

  3. EndPaint(hwnd, &ps)

    其中ps是一个PAINTSTRUCT结构,通过BeginPaint函数将重绘所需的各个详细参数保存到ps结构中,要想知道BeginPaint函数获取了哪些信息,就先得了解一下PAINTSTRUCT结构原型:

  1. typedef struct tagPAINTSTRUCT { 

  2.   
    HDC  hdc;  //设备句柄
  3.   BOOL fErase;  //若为非零。说明用户背景已被重画过,否则未被重画,大多数为FALSE(0)。
  4.   RECT rcPaint; // 指定要求重画(着色)的矩形区域,RECT结构的四个字段为left、top、right和bottom
  5.   BOOL fRestore;  //是Windows自己用的,不关咱程序员的事儿
  6.   BOOL fIncUpdate; //是Windows自己用的,不关咱程序员的事儿 
  7.   BYTE rgbReserved[32]; //是Windows自己用的,不关咱程序员的事儿
  8. } PAINTSTRUCT, *PPAINTSTRUCT;

    在这个结构体中,我们要关注的就只有三个结构成员:hdc, fErase和rcPaint,这样就好理解了。在程序中通过断点可以看到ps结构体中各个成员的值(如图1)。

 


图1

 

    这样一看,就一目了然了。

 

    (2)GetDC/ReleaseDC

  1. hdc = GetDC (hwnd) ;
  2.         
  3. 使用GDI函数
  4.         
  5. ReleaseDC (hwnd, hdc) ;

    GetDC/ReleaseDC和BeginPaint/EndPaint一样,也是成对儿出现的。其中有个概念需要弄清楚,那就是什么是「无效区域」。Windows内部为每个窗口保存一个「绘图信息结构」,这个结构包含了包围无效区域的最小矩形的坐标以及其它信息,这个矩形就叫做「无效矩形」,有时也称为「无效区域」,也称为「更新区域」。

 

    知道了获取设备内容句柄的两种方法,但只是知道两种方法的不同作用,第二种方法具体怎么用也不太明白,不过在第17章《文字和字体》中应该有详细的讲解。

 

    在讲解这两种方法时,还说到了WM_NCPAINT,这是非显示区域绘制消息,估计做程序皮肤时,就得用这个消息来画窗体标题栏。

posted @ 2008-10-16 20:35  冷寒生  阅读(5283)  评论(0编辑  收藏  举报
IT知识库