如何使用Direct2D api滚动窗口内容?

时间:2012-05-14 07:36:55

标签: gdi direct3d direct2d

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

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

您可以使用翻译。

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

答案 2 :(得分:1)

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