我想通过 ID2D1RenderTarget 滚动使用 Direct2D api 执行绘图的窗口内容。
在 GDI 中,我可以使用 CreateCompatibleDC 创建一个缓冲区,然后使用 ScrollDC 滚动其内容,重绘暴露区域并将缓冲区 BitBlt 到窗口。
我在 Direct2D 中看不到任何必要的 API 来执行相同的操作。如何在不使用 GetDC(和 GDI)以及不使用自己的第三个缓冲区的情况下实现相同的功能?
你可以使用翻译。
MSDN:平移 2-D 对象是沿 x 轴、y 轴或两者移动对象。
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Translation(20, 10));
更多细节在这里 http://msdn.microsoft.com/en-us/library/windows/desktop/dd756691(v=vs.85).aspx
Direct2D 中没有滚动 API。获得硬件加速滚动的最佳解决方案是使用第二个缓冲区。在ID2D1RenderTarget
您要滚动的地方,使用CreateCompatibleRenderTarget()
创建一个ID2D1BitmapRenderTarget
(缓存这个家伙是个好主意),其像素大小ID2D1RenderTarget::GetPixelSize()
与从ID2D1RenderTarget::GetDpi()
. 然后,用于ID2D1BitmapRenderTarget::GetBitmap()
获取底层ID2D1Bitmap
. 接下来,使用ID2D1Bitmap::CopyFromRenderTarget()
复制内容并调整您滚动的距离。然后将该位图的内容复制回原始渲染目标,重新渲染未覆盖的区域,并呈现(通过 EndDraw)。
在 DXGI 1.2 中有一个带
参数的新IDXGISwapChain1::Present1
API 调用。DXGI_PRESENT_PARAMETERS
它包含支持滚动窗口内容的功能。