gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:15:22 31 4
gpt4 key购买 nike

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

我需要对 Direct2D 做同样的事情吗? MSDN上的所有例子都只是胡乱地画出了整个客户区,网上搜索也没有找到其他东西。

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

此外,ID2D1HwndRenderTarget::Resize() 的文档说

After this method is called, the contents of the render target's back-buffer are not defined, even if the D2D1_PRESENT_OPTIONS_RETAIN_CONTENTS option was specified when the render target was created.

这是否意味着调整大小会导致任何更新区域(例如 this picture 中的 this page 显示)都是无效的,我应该重新绘制整个窗口(例如,通过调用 InvalidateRect(NULL) )调整大小?

谢谢。

最佳答案

是的。将 PushAxisAlignedClipD2D1_ANTIALIAS_MODE_ALIASED 结合使用。

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

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

关于winapi - 我应该如何处理 Direct2D 应用程序中的更新矩形/区域/区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33129163/

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