我应该如何处理 Direct2D 应用程序中的更新矩形/区域/区域?

and*_*abs 5 winapi direct2d

在使用 GDI 进行图形的传统 Windows 程序中,您将不得不担心只绘制需要重绘的窗口区域;这是“更新矩形”,可PAINTSTRUCT.rcPaint通过调用或调用GetUpdateRect(). (这也可以HRGN通过其他方式获得。)

我需要用 Direct2D 做同样的事情吗?MSDN 上的所有示例都只是随意绘制了整个客户区,而在线搜索并没有发现其他任何内容。

或者换句话说,如果我只在更新矩形内绘制,例如手动或使用PushAxisAlignedClip()或,更新矩形之外的部分会发生什么不好的事情PushLayer()

此外,文档ID2D1HwndRenderTarget::Resize()

调用此方法后,即使在创建渲染目标时指定了 D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS 选项,也不会定义渲染目标的后台缓冲区的内容。

这是否意味着,无论更新区域将通过(如所示通过调整引起的这幅画这个网页)是无效的,我应该重新绘制整个窗口(例如,通过调用InvalidateRect(NULL))在一个调整大小?

谢谢。

Ric*_*ter 3

是的。PushAxisAlignedClip与 一起使用D2D1_ANTIALIAS_MODE_ALIASED

ID2D1HwndRenderTarget::Resize调整窗口大小时调用。请注意它返回的 HRESULT。它可以返回D2DERR_RECREATE_TARGET,但你可能不知道它也可以返回D2DERR_DISPLAY_STATE_INVALID(顺便说一句,也可以返回EndDraw)。是的,InvalidateRect(NULL)之后打电话。

我还建议使用D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS,否则你会在一些愚蠢的驱动程序/硬件配置和其他事件中遇到讨厌的错误。不要问我为什么——没有这个它就不会表现得很好。您将收到错误报告,表明您的整个渲染区域被黑色填充。我花了几个月的时间才弄清楚我所要做的就是使用那面旗帜。我始终无法在本地重现该问题。