如何从Direct2DCanvas复制选择到剪贴板?

问题描述 投票:0回答:1

我制作了一个小程序在D2DBox上绘制几何图形(使用Direct2DCanvas和RenderTarget),我需要能够将矩形复制到剪贴板。尝试过这个,但是我被源句柄参数卡住了:

bm := TBitmap.Create;
try
  bm.SetSize(maxx-minx, maxy-miny);
  BitBlt(bm.Canvas.Handle, minx, miny, maxx, maxy, ??? , 0, 0, SRCCOPY);
  Clipboard.Assign(bm);
finally
  bm.Free;
end;

任何知道从哪里获取帮助的想法?还是整个事情以不同的方式完成?谢谢!

delphi clipboard direct2d
1个回答
1
投票

BitBlt()要求复制GDI HDC,但TDirect2DCanvas没有自己的HDC,并且它不能直接渲染到屏幕外的HDC /TCanvas],例如TBitmap.Canvas,按其documentation

TDirect2DCanvas仅适用于屏幕上的设备上下文。例如,您不能使用TDirect2DCanvas在打印机设备上下文上进行绘制。

由于RenderTarget属性是只读的,因此您无法关联自定义的ID2D1Factory.CreateDCRenderTarget()(例如用ID2D1Factory.CreateDCRenderTarget()ID2D1DCRenderTarget.BindDC()创建的自定义)。

因此,您可能必须走很长一段路才能得到想要的东西。基于我在ID2D1DCRenderTarget.BindDC()中发现的代码(该代码演示了将任意TDirect2DCanvas.RenderTarget复制到任意Direct2d Desktop printing C++),您可以尝试以下操作:

  • 使用目标的ID2D1RenderTarget方法之一创建与画布当前HDC绑定的Direct2D ID2D1Bitmap

  • 使用位图的RenderTarget方法将像素从画布复制到位图中。

  • 创建CreateBitmap()(您可以为此使用VCL的CreateBitmap()),并使用其中一种CopyFromRenderTarget()方法和其中一种CopyFromRenderTarget()方法将Direct2D位图呈现给它。

  • 创建一个GDI IWICBitmap位图,并使用WIC位图的IWICBitmap方法将其渲染为TWICImage

  • 最后,您可以根据需要使用TWICImage,例如选择/复制到最终的ID2D1Factory.CreateWicBitmapRenderTarget(),也可以使用ID2D1Factory.CreateWicBitmapRenderTarget()格式直接将其内容直接放置在剪贴板上。

    ] >
  • 这里是代码(对不起,它是C ++语言,我不会将其翻译为Delphi):

    ID2D1RenderTarget.DrawBitmap()

在同一讨论中,描述了另一种替代方法:

  • 创建DIB部分,并将其选择为DC

  • 创建DC渲染目标

  • 将渲染目标绑定到与DIB部分对应的DC

  • 使用Direct2D绘制。调用EndDraw之后,DIB包含已渲染的内容。

  • 最后一步是在需要的地方绘制dib。

  • 因此,请尝试将绘图代码移至其自己的函数,该函数以ID2D1RenderTarget.DrawBitmap()作为输入并根据需要在其上进行绘制。然后,当您想在剪贴板上放置位图时,可以创建基于DIBIWICBitmap,当您想在CopyPixels()上绘制时,可以使用CopyPixels()

    © www.soinside.com 2019 - 2024. All rights reserved.