给定以下代码片段:
procedure TPicture.PaintLine(_Canvas: TCanvas; _Left, _Top, _Right, _Bottom: Integer);
begin
IntersectClipRect(_Canvas.Handle, _Left, _Top, _Right, _Bottom);
try
_Canvas.MoveTo(_Left - 10, _Top - 10);
_Canvas.LineTo(_Right + 10, _Bottom + 10);
// (This is an example only, the actual drawing is much more complex.)
finally
SelectClipRgn(_Canvas.Handle, 0); // This does too much
end;
end;
我想撤消调用 IntersectClipRect 所影响的剪辑,以便先前活动的剪辑再次变为活动状态。在上面的代码中,这是由 SelectClipRgn(...,0) 完成的,它完全关闭剪辑。这有点工作,但之后没有活动剪辑,因此在上述之后执行的任何绘图都将绘制到不应该绘制的区域。
那么,仅撤消 IntersectClipRect 效果的正确方法是什么?
编辑:在我理解了 Sertac 的评论后,删除了不必要的 CreateRectRgn 和 DeleteObject 代码,以使以后可能偶然发现的其他人更容易理解这个问题。