[英]Replacing StretchDIBits with GDI+ (while drawing an Image to Printer's canvas)
[英]GDI+ drawing on a TBitmap
除了通过TGPGraphics
将 GDI+ 绘制到控件 canvas 上(一直工作正常)之外,我还尝试使用 GDI+ 绘制到TBitmap
上,然后将 bitmap 绘制到控件 ZFCC790C72A861905CDZB 上。 但是,实际上似乎没有绘制任何内容。
以下代码在WM_PAINT
消息处理程序中,它再次适用于实际控件 canvas,但是当创建等效的TGPGraphics
object 并传递此TBitmap
句柄时,什么都不会绘制:
FBitmapCanvas:= CreateGPCanvas(FBitmap.Handle);
try
FBitmapCanvas.DrawLine(FSomePen, P1, P2); //Same pen used to successfully draw to control canvas
finally
FreeAndNil(FBitmapCanvas);
end;
Canvas.Draw(0, 0, FBitmap); //Draw this bitmap to control canvas
CreateGPCanvas 看起来像这样,并且用于此 bitmap 和控件:
function CreateGPCanvas(const DC: HDC): TGPGraphics;
begin
Result:= TGPGraphics.Create(DC);
Result.SetInterpolationMode(InterpolationMode.InterpolationModeHighQuality);
Result.SetSmoothingMode(SmoothingMode.SmoothingModeHighQuality);
Result.SetCompositingQuality(CompositingQuality.CompositingQualityHighQuality);
end;
另一方面,如果我不尝试使用TGPGraphics
而是直接通过TBitmap.Canvas
属性画一条线,它可以正常工作(但当然看起来很难看,因为它不是 GDI+)。 所以我知道实际的 bitmap 被正确绘制到控件 canvas。
FBitmap.Canvas.MoveTo(P1.X, P1.Y);
FBitmap.Canvas.LineTo(P2.X, P2.Y);
我在这里做错了什么,如何让TGPGraphics
在这个 bitmap canvas 上工作?
PS - 我完全使用TBitmap
的唯一原因是因为我实际编写的内容需要“记住”以前绘制的部分并保留它,而不是一遍又一遍地重新绘制它。
刚刚发现问题,这是一个愚蠢的错误。
创建TGPGraphics
object 时,而不是传递FBitmap.Handle
,而应该是FBitmap.Canvas.Handle
。
您需要位图的 canvas 的句柄,而不是 bitmap 本身的句柄。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.