【问题标题】:Direct2D: leave a region of a window render target untouchedDirect2D:保持窗口渲染目标的区域不变
【发布时间】:2012-07-03 11:15:28
【问题描述】:

我正在绘制一个常规的HwndRengerTarget,但其他与 Direct2D 无关的窗口会重叠它。

问题是当我绘制到HwndRengerTarget 时,这些窗口被涂漆了。

我想告诉 Direct2D 不要触摸 HwndRengerTarget 的特定区域(即不要触摸屏幕上已经存在的像素),以便这些窗口保持正确可见。

这可能吗?

如果我正常绘制然后在windows上调用RedrawWindow,它会闪烁很多。

谢谢。

【问题讨论】:

    标签: direct2d


    【解决方案1】:

    如果您想手动将渲染限制在某个区域,您可以使用图层(ID2D1Layer 对象)。 更多信息在这里Layers Overview

    如果可见区域是矩形,则通过方法PushAxisAlignedClipPopAxisAlignedClip 使用轴对齐剪辑可能更简单。 ID2D1RenderTarget::PushAxisAlignedClip

    另一种将绘图限制为特定形状的方法是将其渲染为位图,然后通过FillGeomtry 方法中的位图画笔使用此位图。 ID2D1RenderTarget::FillGeometry

    【讨论】:

    • 谢谢,问题是我希望 Direct2D 不覆盖对话框的按钮和其他控件(在常规对话框编辑器中创建),因此图层或 FillGeometry 需要手动输入坐标每个按钮/控件。我刚刚看到 Rick Brewster 的回答,我试过了,现在它不起作用,但如果它起作用了,它将避免任何手动坐标工作......
    • 如果自动剪裁不适合您,您可以尝试自己设置,例如通过 SelectClipRgn。 msdn.microsoft.com/en-us/library/windows/desktop/… 不过你需要自己计算和提供区域。
    • 根据msdn.microsoft.com/en-us/library/windows/desktop/…,图层的性能优于位图画笔。应该高于列表中的#3。
    【解决方案2】:

    为什么不安排窗口 (HWND) 使 Direct2D 位于 z-index 的底部?它应该是其父母的第一个孩子。然后剪裁将是自动的。您可能需要 WS_CLIPSIBLINGS 窗口样式。

    【讨论】:

    • 谢谢,但我尝试了 SetWindowPos(childWindow, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE) 并且兄弟窗口仍在被绘制。父窗口是一个对话框,当我在 childWindow 上绘制时(使用 childWindowRenderTarget->BeginDraw() 和 EndDraw()),我希望 Direct2D 不会覆盖父窗口的按钮和其他控件。也许 Direct2D 是“直接”且更面向硬件的,只是将 direct2d 像素信息通过将其视为矩形来将其传送到窗口,并绕过有关父/子和 z-orders 的 win32 信息,这可能吗?
    • 嗯,我以前也有过这个工作(证明:blog.getpaint.net/2010/04/03/…)。不幸的是,我不知道我当时使用的所有魔术窗口样式和其他东西的具体组合。然而,这是可能的。它肯定是使用ID2D1HwndRenderTarget 的硬件加速。从我的博客文章来看,窗口的 HWND 似乎是单独存在的,它有一个用于 D2D 渲染的子 HWND。然后,该子窗口将按钮和其他标准控件作为子 HWND。
    • 谢谢,有趣的是你让它工作了。我尝试将窗口样式 WS_EX_COMPOSITED 和 WS_CLIPSIBLINGS(我正在使用 c++)添加到对话框,父窗口,但按钮仍然被对话框的另一个子窗口覆盖,我在上面使用 Direct2D BeginDraw()/EndDraw()。我使用 CreateWindowEx(WS_CHILD, dialogHwnd) 创建该窗口,因此它是按钮的兄弟。我将不得不再搞砸它。
    【解决方案3】:

    我遇到了同样的问题。

    已通过为 D2D 子 HWND 调用 CreateWindowEx LAST 修复。 所以在创建所有其他子窗口之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      • 2016-02-11
      • 2016-10-11
      • 1970-01-01
      • 2017-05-22
      • 2013-09-30
      • 1970-01-01
      相关资源
      最近更新 更多