繁体   English   中英

GDI+ 在 TBitmap 上绘图

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM