GDI+ 在 TBitmap 上绘图

GDI+ drawing on a TBitmap

除了通过 TGPGraphics 将 GDI+ 绘制到控件 canvas 之外(一直工作正常),我还尝试使用 GDI+ 绘制到 TBitmap 上,然后将该位图绘制到控件 canvas。但是,实际上似乎没有绘制任何东西。

以下代码在 WM_PAINT 消息处理程序中,它再次适用于实际控件 canvas,但是当创建等效的 TGPGraphics 对象并传递此 TBitmap handle,什么都没有画:

  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 看起来像这样,并且用于此位图和控件:

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+)。所以我知道实际的位图被正确绘制到控件 canvas.

FBitmap.Canvas.MoveTo(P1.X, P1.Y);
FBitmap.Canvas.LineTo(P2.X, P2.Y);

我在这里做错了什么,我如何让 TGPGraphics 在这个位图上工作 canvas?


PS - 我使用 TBitmap 的唯一原因是因为我实际写的东西需要 "remember" 之前绘制和保留的一部分它,而不是一遍又一遍地重新粉刷它。

刚刚弄明白问题所在,结果犯了一个愚蠢的错误

创建 TGPGraphics 对象时,不应传递 FBitmap.Handle,而应传递 FBitmap.Canvas.Handle

您需要位图 canvas 的句柄,而不是位图本身的句柄。