【发布时间】:2013-09-06 21:56:50
【问题描述】:
给定以下代码sn-p:
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 代码,以便让以后可能偶然发现的其他人更容易理解这个问题。
【问题讨论】:
-
不相关,但只是一个建议... 下划线
_前缀通常用于全局变量(与任何对象无关),而前缀A通常建议用于方法参数;或者根本没有前缀。如果您按照现在的方式进行操作,没有什么坏处,只是建议您遵循更多的标准做法。至少你添加了一个前缀来明确区分这些,尽管我建议使用A而不是_以更符合编码实践。 -
我发布了一个答案,考虑到您实际上并没有以任何方式使用您在“尝试”之前创建的区域 - 直到“最终”。你对问题的演示是否正确?还是问题中的代码应该不同?
-
@Jerry Dodge:我不打算讨论编码风格。根据我的经验,这不会导致任何结果。
-
@Sertac Akyuz:根据 MSDN 文档,IntersectClipRect 必须传递一个现有的 HRGN。
-
@dumm - 再次阅读文档。如您所见,您没有将任何区域传递给它。
标签: windows delphi gdi clipping