如何使用 Direct2D API 滚动窗口内容



我想滚动窗口内容,其中绘图是通过 ID2D1RenderTarget 使用 Direct2D api 执行的。

在GDI中,我可以使用CreateCompatibleDC创建一个缓冲区,然后使用ScrollDC滚动其内容,重新绘制暴露区域并将缓冲区BitBlt到窗口。

我在 Direct2D 中看不到任何必要的 API 来执行相同的操作。如何在不使用 GetDC(和 GDI)和不使用自己的第三个缓冲区的情况下实现相同的功能?

Direct2D 中没有滚动 API。获得硬件加速滚动的最佳解决方案是使用第二个缓冲区。在要滚动的ID2D1RenderTarget上,使用 CreateCompatibleRenderTarget() 创建一个像素大小与ID2D1RenderTarget::GetPixelSize()相同像素大小和分辨率与ID2D1RenderTarget::GetDpi()相同的ID2D1BitmapRenderTarget(最好缓存这家伙)。然后,使用 ID2D1BitmapRenderTarget::GetBitmap() 获取基础ID2D1Bitmap。接下来,使用ID2D1Bitmap::CopyFromRenderTarget()复制内容,并根据滚动的距离进行调整。然后将该位图的内容复制回原始呈现目标,重新呈现未覆盖的区域,并呈现(通过 EndDraw)。

您可以使用翻译。

MSDN:平移二维对象就是沿 x 轴和/或 y 轴移动对象。

m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Translation(20, 10));

更多细节在这里http://msdn.microsoft.com/en-us/library/windows/desktop/dd756691(v=vs.85).aspx

在 DXGI 1.2 中,有一个新的 IDXGISwapChain1::Present1 API 调用,其中包含DXGI_PRESENT_PARAMETERS参数。它包含支持滚动窗口内容的功能。

最新更新