我想滚动窗口内容,其中使用Direct2D api通过ID2D1RenderTarget执行绘图。
在GDI中,我可以使用CreateCompatibleDC创建一个缓冲区,稍后使用ScrollDC滚动其内容,重绘暴露区域,将缓冲区BitBlt拖到窗口。
我在Direct2D中看不到任何必要的API来执行相同的操作。如何在不使用GetDC(和GDI)的情况下实现相同的功能,并且不使用自己的第三个缓冲区?
答案 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
参数。它包含支持滚动窗口内容的功能。