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 的句柄,而不是位图本身的句柄。
除了通过 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 的句柄,而不是位图本身的句柄。