我想滚动窗口内容,其中绘图是通过 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
参数。它包含支持滚动窗口内容的功能。