如何访问TCanvas.ClipRect?

时间:2014-10-22 17:14:58

标签: delphi firemonkey

我试图将一些代码从Delphi移植到Firemonkey(XE6)。

我遇到了一个函数的问题,该函数绘制到调用者提供的TCanvas。 Canvas可以来自TPaintBox,TPanel,TForm或TBitmap。该函数读取TCanvas.ClipRect属性以避免在其外部执行cpu密集型绘制。 (cliprect表示TForm,TPaintBox等的无效区域。)

不幸的是,TCanvas ClipRect属性似乎不再存在。有谁知道如何在Firemonkey中访问TCanvas.ClipRect?我注意到TPaintBox和TPanel现在有一个ClipRect属性,所以我可以使用它们,但TForm和TBitmap不会。

请注意,我没有尝试在画布中创建或更改剪辑,我试图阅读它。

2 个答案:

答案 0 :(得分:0)

DoBeginScene有一个cliprects参数。但似乎并没有一种方法来实际检索这个价值。除此之外,画布上可能还有其他剪辑。

为了获取剪辑,需要画布的dc或cgcontext。你可以使用RTTI获得它。这是OSX的一个例子:

function TCanvasCHelper.GetCGContext: CGContextRef;
var
  Context: TRttiContext;
  Field: TRttiField;
begin
  // needs about 1ms
  Field := Context.GetType(TCanvasQuartz).GetField('FContext');       // get private field using RTTI
  Assert(Field <> nil);
  Result := PPointer(Field.GetValue(Self).GetReferenceToRawData)^;
end;

不幸的是,使用RTTI可能没有所需的那么快。我最终不得不创建一个暴露CGContext或DC的FMX.Canvas。*类的副本。如果你想用FMX没有实现的画布做更高级的事情,你还是需要这个。

当您拥有CGContext或DC时,您可以使用操作系统的功能,如CGContextGetClipBoundingBox或GetClipBox,以便在画布支持时检索剪辑。

答案 1 :(得分:0)

您使用Scene的{​​{1}}属性。它有一个要绘制的剪辑列表。使用TControlGetUpdateRectsCount来阅读它们。

例如,此代码读出需要重新绘制的rects:

GetUpdateRect