我制作了一个小程序在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;
任何知道从哪里获取帮助的想法?还是整个事情以不同的方式完成?谢谢!
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()
作为输入并根据需要在其上进行绘制。然后,当您想在剪贴板上放置位图时,可以创建基于DIB
的IWICBitmap
,当您想在CopyPixels()
上绘制时,可以使用CopyPixels()
。