Windows成像组件 – Direct2D C ++ – 绘图,保存

使用Windows映像组件(WIC),我想为我的Windows桌面应用程序(Direct2D / C ++与Windows 7 SP1 – Visual Studio 2013)

  1. select任何types的RenderTarget(Direct2D Hwnd / Bitmap / WICBitmap – 等)进行绘制

  2. 创build一个空的位图(D2D1Bitmap或IWICBitmap – 无论哪个适用)

  3. 开始绘制 – 填充颜色,绘制一些线条和椭圆 – 结束绘制==>(全部在位图中)

  4. 在某些时候,我需要将绘制的内容保存在位图中作为我的电脑中的图像

  5. 将位图放在渲染目标的x1,y1(左上angular的xy坐标)和x2,y2(右下angular的xy坐标)中。 因为窗口的其余部分将被工具栏使用。

我如何使用C ++ / Direct2D来实现这一目标?

GDI +我的function代码:

Bitmap* pBmp = NULL; //create null or empty bitmap Graphics* pGrBuf = NULL; //initialise graphics to null pBmp = new Bitmap((INT)rectClient.Width, (INT)rectClient.Height); pGrBuf = new Graphics(pBmp); 

在这个graphics上,我总是可以绘制线条,矩形等。

 pGrBuf.DrawRectangle(....) pGrBuf.DrawLine(...) 

最后,达到第5点

 //leave some space (30, 30 in xy co-ordinates) for putting the toolbox in the top pGrBuf.DrawImage(m_pBmp, 30.0f, 30.0f); 

点4的代码被故意省略。

这个问题有一个简单的,明确的答案,但有一些细节,你应该(重新)考虑。

Direct2D不是一个万能的框架,很容易胜过其他人。 不太清楚你的图画是什么,他们的目的是什么,但有些情况下,Direct2D的使用不是很合适。 如果您用D2D替换GDI(+),您的一些苦难将是:

  • (官方)有限的操作系统支持,根据DirectX版本和/或您将使用的功能。 你将不得不忘记Windows XP,(很可能)Windows Vista和(不太可能)Windows 7
  • 性能(与GDI +,GDI相比)并不总是更大。 主要取决于您使用D2D的方式和目的。 有些情况下,D2D的性能很差(通常错误的使用或误解的概念)。

而且,Direct2D可以提供的优势是无数。

粗略地说,Direct2D不过是Direct3D的封装。 它是与DirectX 10一起推出的,其用法与GDI(+)非常相似。 但是在DirectX 11(1)中,Direct2D的“原则”已经改变,现在更像D3D。 它增加了另一种方法,并删除旧的。 起初可能有点混乱。 令人困惑的是,也是因为所有教程,文章以及网络中的任何D2D资源(包括MSDN)在D2D版本之间混淆在一起。 其中一些是为旧版本和推荐一件事(方法),其他描述新版本。

无论如何,我推荐新版本 – 即Direct2D 11.1。

对你的问题…

  1. “RenderTarget”是来自“旧”D2D的概念。 新的是一个DeviceContext
  2. DeviceContext的目标可能是D2D1Bitmap(1) – 屏幕外的一个交换链的后台缓冲区。
  3. 最典型的绘图方法是在DeviceContext.BeginScene — DeviceContext.EndScene块中调用绘图函数。 绘图功能与GDI(+)非常相似。
  4. 有几种方法可以做到这一点。 你可以在WIC的帮助下做到这一点。 您也可以将D2D1Bitmap数据复制到DIBBitmap中,或者甚至可以通过GDI上下文(重新)绘制它们。
  5. 有一个函数DeviceContext.DrawImage,但你会这样做取决于很多事情。 例如,你可以有两个位图,通过两个不同的HWnd(一个用于工具栏,另一个用于另一个图形)绘制。

以下是一些可以帮助您的资源:

  • 什么是Direct2D的
  • 用Direct2D绘制一个矩形
  • 很好地解释了有关迁移到Direct2D 1.1的指南
  • 在这里回答另一个与Direct2D有关的问题 ,但是总之你应该画一个HWnd