BeginPaint函数为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个PAINTSTRUCT结构中。
WINUSERAPI
HDC
WINAPI
BeginPaint(
__in HWND hWnd, //窗口句柄
__out LPPAINTSTRUCT lpPaint); //绘图环境指针
EndPaint 函数标记指定窗口的绘画过程结束;这个函数在每次调用BeginPaint函数之后被请求,但仅仅在绘画完成以后。
BOOL EndPaint(
HWND hWnd, // 窗口句柄
CONST PAINTSTRUCT *lpPaint // 绘制窗口的数据
);
PAINTSTRUCT是一种包含了某应用程序用来绘制它所拥有的窗口客户区所需要的信息的结构体。
typedef struct tagPAINTSTRUCT {
HDC hdc; //绘图上下文句柄
BOOL fErase; //如果为非零值则擦除背景,否则不擦除背景
RECT rcPaint; //绘图区域
BOOL fRestore; //系统预留,暂时不用
BOOL fIncUpdate;//系统预留,暂时不用
BYTE rgbReserved[32];//系统预留,暂时不用
} PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;
BeginPaint可以得到客户区设备描述表的句柄,GetDC也可以得到,MFC里的CClientDC与之对应。
关于BeginPaint、EndPaint和GetDC、ReleaseDC的区别,算是扩展阅读部分:
BeginPaint() 和EndPaint() 可以删除消息队列中的WM_PAINT消息,并使无效区域有效。
GetDC()和ReleaseDC()并不删除也不能使无效区域有效,因此当程序跳出 WM_PAINT 时 ,无效区域仍然存在。系统就回不断发送WM_PAINT消息,于是程序不断处理WM_PAINT消息。
BeginPaint、EndPaint会告诉GDI内部,这个窗口需要重画的地方已经重画了,这样WM_PAINT处理完返回给系统后,系统不会再重发WM_PAINT,而GetDC没有告诉系统这个窗口需要重画的地方已经画过,在你把程序返回给系统后,系统一直以为通知你的重画命令你还没有乖乖的执行或者执行出错,所以在消息空闲时,它还会不断地发WM_PAINT催促你画,导致程序卡死。
Te