gpt4 book ai didi

winapi: GetUpdateRect() with bRepaint TRUE in WM_PAINT 不清除绘画区域,但 InvalidateRect() 在 WM_PAINT 之外?

转载 作者:数据小太阳 更新时间:2023-10-29 03:17:38 26 4
gpt4 key购买 nike

我的自定义绘图区的 WM_PAINT 看起来像这样:

// TRUE to clear the background
if (GetUpdateRect(hwnd, &r, TRUE) == 0)
return; // no update rect; do nothing
dc = BeginPaint(hwnd, &ps);
// check return
// paint some RGBA image data with GDI+
EndPaint(hwnd, &ps);

(暂时忽略向 GDI+ 发送 HDC。)

我在这里使用 GetUpdateRect() 而不是从 BeginPaint() 获取更新矩形,因为我总是想在空白 Canvas 上绘制,尤其是因为我正在做alpha 混合绘图在这里。此外,the docs for WM_PAINT如果 GetUpdateRect() 失败,请说不要调用 BeginPaint()

但是,当我的自定义绘图区实际执行此 WM_PAINT 时,它并没有清除绘图区。我可以这么说,因为启用 alpha 的图像是在其自身之上绘制的,导致颜色更深。

在我的代码的另一部分中,我通过调用 InvalidateRect() 来响应键盘事件以强制更新整个区域。如果我改变相当于

InvalidateRect(hwnd, NULL, FALSE);

InvalidateRect(hwnd, NULL, TRUE);

该区域确实得到了正确的清理。

那么我到底做错了什么?谢谢。

(实际代码是 this ;它是用 Go 编写的。这也是我直接使用 GDI+ 的原因。(我还没有弄清楚如何使用常规 GDI 进行 alpha 混合。))

最佳答案

InvalidateRect 使区域无效,这意味着它之后是删除/重绘请求。您将它与 GetUpdateRect 进行比较,后者不执行验证或无效操作,并且使用 TRUE 参数删除该区域的方式与使用标准绘画删除的方式相同。此外as MSDN states :

The update rectangle retrieved by the BeginPaint function is identical to that retrieved by GetUpdateRect.

BeginPaint automatically validates the update region, so any call to GetUpdateRect made immediately after the call to BeginPaint retrieves an empty update region.

总而言之,我看不出有任何理由像您在绘制处理程序中那样调用 GetUpdateRectBeginPaint 以相同的方式执行此操作,并进行验证,无论如何,您一进入绘制处理程序就需要执行此操作。到达那里后,删除处理程序已被调用,无需通过 GetUpdateRect 再次调用它。

BeginPaintPAINTSTRUCT::rcPaint 以同样的方式获取更新区域,只是在调用 EndPaint 之前不要做任何事情,如果更新区域为空。

关于winapi: GetUpdateRect() with bRepaint TRUE in WM_PAINT 不清除绘画区域,但 InvalidateRect() 在 WM_PAINT 之外?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23001890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com