【问题标题】:GDI+ drawing on a TBitmapGDI+ 在 TBitmap 上绘图
【发布时间】:2020-02-16 22:18:08
【问题描述】:

除了通过TGPGraphics 将 GDI+ 绘制到控制画布上(一直工作正常),我还尝试使用 GDI+ 在TBitmap 上绘制,然后将该位图绘制到控制画布上.但是,实际上似乎没有绘制任何内容。

以下代码在WM_PAINT 消息处理程序中,它同样适用于实际的控制画布,但是当创建等效的TGPGraphics 对象并传递此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 看起来像这样,用于此位图和控件:

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

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

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


PS - 我使用TBitmap 的唯一原因是因为我实际编写的内容需要“记住”之前绘制的部分并保留它,而不是一遍又一遍地重新绘制。

【问题讨论】:

    标签: delphi canvas gdi+ vcl delphi-10.1-berlin


    【解决方案1】:

    刚刚发现问题,这是一个愚蠢的错误。

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-16
      • 2021-08-03
      • 2017-05-28
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多