我试图将一些代码从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不会。
请注意,我没有尝试在画布中创建或更改剪辑,我试图阅读它。
答案 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}}属性。它有一个要绘制的剪辑列表。使用TControl
和GetUpdateRectsCount
来阅读它们。
例如,此代码读出需要重新绘制的rects:
GetUpdateRect