[GDI +在位图上绘制

问题描述 投票:-1回答:1

除了通过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的唯一原因是因为我实际编写的内容需要“记住”先前绘制的部分并保留它,而不是一遍又一遍地重新绘制。] >

除了通过TGPGraphics将GDI +绘制到控件画布上(运行良好)之外,我还试图使用GDI +绘制到TBitmap上,然后将该位图绘制到控件上...

delphi canvas gdi+ vcl delphi-10.1-berlin
1个回答
0
投票

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

创建TGPGraphics对象时,与其传递FBitmap.Handle,不如传递FBitmap.Canvas.Handle

© www.soinside.com 2019 - 2024. All rights reserved.