书籍:《windows程序设计(第五版)》
环境:visual studio 2022
内容:窗口和消息->WM_PAINT消息
说明:以下内容大部分来自腾讯元宝。
PAINTSTRUCT是Windows编程中用于描述窗口客户区绘制操作的结构体,其定义如下:
typedef struct tagPAINTSTRUCT {
HDC hdc; // 设备上下文句柄,用于绘图操作
BOOL fErase; // 是否擦除背景,非零值表示擦除
RECT rcPaint; // 要绘制的矩形区域,坐标相对于客户区左上角
BOOL fRestore; // 系统保留位,用于绘图恢复
BOOL fIncUpdate; // 系统保留位,用于更新区域增量
BYTE rgbReserved[32]; // 32字节的保留字段,编程中一般不使用
} PAINTSTRUCT, *PPAINTSTRUCT;
核心成员说明
-
hdc
设备上下文(Device Context)句柄,通过BeginPaint
函数获取,用于后续的绘图操作(如GetDC
也可获取,但BeginPaint
更高效且自动处理无效区域)。 -
fErase
布尔值,若为TRUE
则擦除背景,FALSE
则保留原有内容。通常由系统自动管理,开发者无需手动处理。 -
rcPaint
定义了需要重绘的矩形区域,通过左上角和右下角坐标确定范围。此区域由Windows消息(如WM_PAINT
)触发,开发者需在此区域内完成绘制。 -
fRestore/fIncUpdate/rgbReserved
这三个成员为系统预留,用于内部绘图状态管理,普通开发者通常无需直接操作。
使用场景
在Windows API中,PAINTSTRUCT
常与BeginPaint
和EndPaint
函数配合使用:
- 调用
BeginPaint(hwnd, &ps)
获取设备上下文和绘制区域信息; - 在
WM_PAINT
消息处理中,根据rcPaint
指定的区域进行绘制; - 调用
EndPaint(hwnd, &ps)
通知系统绘制完成,释放相关资源。
对比MFC
在MFC框架中,CPaintDC
类封装了PAINTSTRUCT
的调用逻辑,简化了设备上下文的管理。
通过合理利用PAINTSTRUCT
,开发者可以高效地控制窗口的局部重绘,避免全屏闪烁,提升绘图性能。