Windows Imaging Component - Direct2D C ++ - 绘图,保存

时间:2014-08-12 13:10:19

标签: c++ windows graphics bitmap direct2d

使用Windows Image Component(WIC),我想为我的Windows桌面应用程序(使用Windows 7 SP1的Direct2D / C ++ - Visual Studio 2013)执行以下操作

  1. 选择任何类型的RenderTarget(Direct2D Hwnd / Bitmap / WICBitmap - 等)用于绘图

  2. 创建一个空位图(D2D1Bitmap或IWICBitmap - (以适用者为准)

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

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

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

  6. 如何使用C ++ / Direct2D实现这一目标?

    我的功能的GDI +代码:

    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);
    

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

    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点的代码。

1 个答案:

答案 0 :(得分:2)

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

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。它增加了另一种方法并删除旧方法。起初可能有点令人困惑。令人困惑的是,因为Web中的所有教程,文章和任何D2D资源(包括MSDN)都在D2D版本之间混淆。其中一些用于旧版本并推荐一件事(方法),其他用于描述新版本。

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

对你的问题......

  1. " RenderTarget"是一个来自" old" D2D。新的是DeviceContext
  2. DeviceContext有一个目标,可能是D2D1Bitmap(1) - 屏外一个,一个交换链的后台缓冲区。
  3. 最典型的绘图方法是在DeviceContext.BeginScene --- DeviceContext.EndScene块中调用绘图函数。绘图函数与GDI(+)非常相似。
  4. 有几种方法可以做到这一点。你可以在WIC的帮助下完成。您也可以将D2D1Bitmap数据复制到DIBBitmap,或者甚至可以(重新)通过GDI上下文绘制它。
  5. 有一个函数DeviceContext.DrawImage,但你的方式取决于很多东西。例如,您可以有两个位图,它们绘制在两个不同的HWnd上(一个用于工具栏,另一个用于另一个绘图)。
  6. 以下是一些可以帮助您的资源: