绘制与重绘
PAINTSTRUCTURE结构体(Paint Information structure)
typedef struct tagPAINTSTRUCT { HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT;
当窗口处理程序调用BeginPaint函数的时候,Windows会填充这个结构体。只有前三个成员是可以被程序利用的,其余的成员是为系统保留的。
其中各成员变量的含义解释一下:第一个hdc顾名思义,就是指向DC的句柄。
fErase是一个BOOL型变量,反映了窗口背景是否需要被擦除。通常情况它被设为FALSE表明Windows已经擦除了无效矩形的背景。
rcPaint成员是一个RECT变量即矩形变量。它包含了程序需要重新绘制的无效矩形。单位是像素,以客户区的左上角为坐标原点。Windows的重绘都被限制在这个矩形里,所以它又叫作clipping rectangle。
上面给出了第一种获取设备句柄DC的方法,下面介绍方法二:
有时候,你需要获取一个设备句柄以备它用,那么这个时候,你可以使用这种方法:
这个方法由成对出现的GetDC和ReleaseDC组成,示例程序段如下:
hdc = GetDC(hwnd); 【处理过程】 ReleaseDC(hwnd, hdc);
和方法一不同的是这个方法返回的句柄的clipping rectangle是整个客户区,所以你可以在客户区的任何地方进行绘制。
TEXTMETRIC结构体
当你在窗口客户区输出文本的时候,如果没有设置系统会用默认的字体(叫做系统字体)书写文字。可以想象,当你需要输出多行文本的时候,你如何去为下一行的文字腾出足够的高度,一行又能容纳多少文本怎么去决定了呢?这就涉及到了TEXTMETRIC结构体,这个结构体包含了系统字体相关的一些信息,通过它你可以获取现在使用的字体信息。TEXTMETRIC结构体有20个成员,但是我们这里需要关心的只有其中的七个:
typedef struct tagTEXTMETRIC { LONG tmHeight;
LONG tmAscent; LONG tmDescent; LONG tmInternalLeading; LONG tmExternalLeading; LONG tmAveCharWidth; LONG tmMaxCharWidth; } TEXTMETRIC, *PTEXTMETRIC;
这个结构体的单位取决于你所使用的mapping mode,默认情况下mapping mode是MM_TEX,单位是像素(pixel)。
当你需要获取设备字体相关的信息的时候,首先你需要声明一个TEXTMETRIC变量,通常命名为tm,然后,获取了设备句柄之后可以调用GetTextMetrics函数,具体程序段如下:
TEXTMETRIC tm;
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
ReleaseDC(hwnd, hdc);
关于TEXTMETRIC的细节可以参见《programming Windows》相关章节。