绘制与重绘

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》相关章节。

posted on 2012-05-03 12:19  NotValid  阅读(695)  评论(0编辑  收藏  举报

导航