Windows 程序在以下情况会触发WM_PAINT消息:
需要在屏幕上绘图的时候,需要先获取到设备环境句柄,这里有两种方式:
第一个参数是当前的窗口句柄,第二个参数是 PAINTSTRUCT 结构的地址,它将返回一个设备环境句柄。BeginPaint 函数的原型如下:
HDC BeginPaint(
HWND hwnd, // 当前的窗口句柄
LPPAINTSTRUCT lpPaint // PAINTSTRUCT 结构的地址
)
Windows 为每个窗口维护一个“绘制信息结构”,即 PAINTSTRUCT,这里给出了它的定义:
typedef struct tagPAINTSTRUCT {
HDC hdc; // 设备环境句柄,即 BeginPaint 函数的返回值
BOOL fErase; // 背景刷状态,如果为 TRUE,表示无效背景区域需要进行擦除,为 FALSE,表示已经擦除了无效区域的背景
RECT rcPaint; // 无效矩形边界,是一个 RECT 结构,包含 left、top、right、bottom 四个参数
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT;
调用 BeginPaint 函数时,PAINTSTRUCT 结构中的字段将被自动填充。
当调用 BeginPaint 函数获得设备环境句柄,并处理 WM_PAINT 消息后,必须使用 EndPaint 函数释放获取到的设备环境句柄,该函数原型如下:
BOOL EndPaint(
HWND hWnd, // 当前的窗口句柄
CONST PAINTSTRUCT *lpPaint // PAINTSTRUCT 结构的地址
);
源码片段示例:
// ......
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
// 其他GDI代码
EndPaint(hwnd, &ps);
return 0;
// ......
GetDC 函数只有一个参数,即当前的窗口句柄,它将设备环境句柄作为返回值返回。在使用完设备环境句柄后,必须调用 ReleaseDC 函数将其释放,它有两个参数,第一个是当前的窗口句柄,第二个是要释放的设备环境句柄。
// ......
hdc = GetDC(hwnd);
// 其他GDI代码
ReleaseDC(hwnd, hdc);
return 0;
// ......
GetDC / ReleaseDC 组合通常用于处理键盘消息或 (与) 鼠标消息。
🖊️ 本文由 Alone Café 创作,如果您觉得本文让您有所收获,请随意赞赏 🥺
⚖️ 本文以 CC BY-NC-SA 4.0,即《署名-非商业性使用-相同方式共享 4.0 国际许可协议》进行许可
👨⚖️ 本站所发表的文章除注明转载或出处外,均为本站作者原创或翻译,转载前请务必署名并遵守上述协议
🔗 原文链接:https://alone.cafe/2018/05/gdishe-bei-huan-jing-ju-bing
📅 最后更新:2021年10月16日 Saturday 16:03
Update your browser to view this website correctly. Update my browser now