更高效的父绑定矩形副本

时间:2017-02-24 17:15:43

标签: delphi paint firemonkey

我想尽可能高效地复制TRectangle后面的位图区域(例如红色边框)。这是父控件中红色矩形的边界。

我在Delphi Firemonkey应用程序中有这个:

将整个父表面转换为临时父TBitmap:

 (Parent as TControl).PaintTo(FParentBitmap.Canvas,
            RectF(0, 0, ParentWidth, ParentHeight));

然后再复制我想要的矩形:

bmp.CopyFromBitmap(FParentBitmap, BoundsRect, 0, 0);

当然这不高效。我希望在1遍中复制矩形,或者至少我不想将整个父级绘制成临时TBitmap。

你知道一种有效的方法吗?请告诉。

我创建了一个TFrostGlass组件,其中包含完整的源代码。您可以在此处查看/下载它:https://github.com/Spelt/Frost-Glass

复制位图代码位于:FrostGlass.pas

1 个答案:

答案 0 :(得分:0)

不幸的是,PaintTo不允许仅绘制部分控件。但是,正如@Rob Kennedy所提到的,您可以通过修改偏移来控制目标位图上的内容最终结束。

此外,在调用BeginScene之前调用PaintTo时,您可以设置ClipRects参数,这意味着只会更新Canvas的这一部分。如果你的目标位图大于BoundsRect,这是必要的,否则你也会画出它周围的区域。

procedure PaintPartToBitmap(Control: TControl; SourceRect, TargetRect: TRect; Bitmap: TBitmap);
  var ClipRects: TClipRects;
      X, Y: Single;
begin
  ClipRects := [TRectF.Create(TargetRect)];
  if (Bitmap.Canvas.BeginScene(@ClipRects)) then
    try
      X := TargetRect.Left - SourceRect.Left;
      Y := TargetRect.Top - SourceRect.Top;
      Control.PaintTo(Bitmap.Canvas, RectF(X, Y, X + Control.Width, Y + Control.Height));
    finally
      Bitmap.Canvas.EndScene;
    end;
end;