Windows是一个消息驱动系统。它通过把消息投入应用程序消息队列中或者把消息发送给合适的窗口消息处理程序,将发生的各种事件通知给应用程序。Windows通过发送WM_PAINT消息通知窗口消息处理程序,窗口的部分显示区域需要绘制。
无效区域或更新区域,尽管窗口消息处理程序一旦接收到WM_PAINT消息之后,就准备更新整个显示区域,但它经常只需要更新一个较小的区域(最常见的是显示区域中的矩形区域)。显然,当对话框覆盖了部分显示区域时,情况即是如此。在擦除对话框之后,需要重画的只是先前被对话框遮住的矩形区域。
窗口消息处理程序可以通过呼叫InvalidateRect使显示区域内的矩形无效。在处理WM_PAINT消息时,为了在更新的矩形外绘图,可以使用如下呼叫:
InvalidateRect (hwnd, NULL, TRUE) ;
该呼叫在BeginPaint呼叫之前进行,它使整个显示区域变为无效,并擦除背景。但是,如果最后一个参数等于FALSE,则不擦除背景,原有的东西将保留在原处。
通过呼叫GetUpdateRect,可以在任何时候取得坐标。
在处理WM_PAINT消息处理期间,窗口消息处理程序在呼叫了BeginPaint之后,整个显示区域即变为有效。程序也可以通过呼叫ValidateRect函数使显示区域内的任意矩形区域变为有效。如果这呼叫具有令整个无效区域变为有效的效果,则目前队列中的任何WM_PAINT消息都将被删除。
TextOut (hdc, x, y, psText, iLength) ;用于将字符串输出到窗口的显示区域内
TextOut (hdc,//设备内容句柄
x, //x,y参数定义了字符串在显示区域的开始位置
y,
psText, //psText参数是指向字符串的指针
iLength//iLength是字符串的长度) ;
hdc是设备内容句柄,设备内容中的有些值是图形「属性」,这些属性定义了GDI绘图函数工作的细节。例如,对于TextOut,设备内容的属性确定了文字的颜色、文字的背景色、x坐标和y坐标映像到窗口的显示区域的方式,以及显示文字时Windows使用的字体。
注意:当程序在显示区域绘图完毕后,它必须释放设备内容句柄。句柄被程序释放后就不再有效,且不能再被使用。程序必须在处理单个消息处理期间取得和释放句柄。除了呼叫CreateDC函数
方法一:处理WM_PAINT消息时
case WM_PAINT:
PAINTSTRUCT ps ;
HDC hdc ;
hdc = BeginPaint (hwnd, &ps) ;
使用GDI函数//程序就可以使用需要设备内容句柄的TextOut等GDI函数
EndPaint (hwnd, &ps) ;
return 0 ;
方法二:在处理非WM_PAINT消息处理期间绘制显示区域的某个部分,或者需要将设备内容句柄用于其它目的,如取得设备内容的信息
hdc = GetDC (hwnd) ;
使用GDI函数
ReleaseDC (hwnd, hdc) ;
不能在一个消息中呼叫GetDC却在另一个消息呼叫ReleaseDC,与从BeginPaint传回设备内容句柄不同,GetDC传回的设备内容句柄具有一个剪取矩形,它等于整个显示区域。可以在显示区域的某一部分绘图,而不只是在无效矩形上绘图(如果确实存在无效矩形)。与BeginPaint不同,GetDC不会使任何无效区域变为有效。如果需要使整个显示区域有效,可以呼叫
ValidateRect (hwnd, NULL) ;
typedef struct tagPAINTSTRUCT
{
HDC hdc ;
BOOL fErase ;
RECT rcPaint ;
BOOL fRestore ;
BOOL fIncUpdate ;
BYTE rgbReserved[32] ;
} PAINTSTRUCT ;
在程序呼叫BeginPaint时,Windows会适当填入该结构的各个字段值
后续待补充…