次のコード スニペットがあるとします。
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 の効果だけを元に戻す正しい方法は何ですか?
EDIT:Sertacからのコメントを理解した後、不要なCreateRectRgnおよびDeleteObjectコードを削除して、後で遭遇する可能性のある他の人が質問を読みやすくしました。