问题描述
如果我们在处理 WM_PAINT 时在 BeginPaint 期间只有 RECT,为什么 WinAPI 需要 InvalidateRgn 及其指向要添加到更新区域 (hRgn) 的区域的句柄? 提前致谢!
解决方法
Win32 API 大约有 30 年历史;那里有很多代码用于向后兼容。有一个完全理智的InvalidateRect
。
话虽如此,使用 InvalidateRgn
调用 bErase=TRUE
将擦除一个非矩形区域。
需要特定(复杂)的更新区域是一种极为罕见的用例。该系统针对最常见的用例进行了优化,其中应用程序使用矩形使窗口的脏区域无效并跟踪。这就是您在调用 BeginPaint 时得到的结果。
如果您在极少数情况下需要更新区域,则可以改为调用 GetUpdateRgn。由于 BeginPaint
验证更新区域,因此您必须在此之前调用 GetUpdateRegion
。
为什么 Windows 不直接发明一个返回更新区域的 BeginPaintEx
API?因为添加 API 的成本高得令人难以置信,而且需要有充分的理由。添加一个不添加任何值的函数(如本例中)很难证明是合理的。