GetBounds()メソッドが返されるSystem.Drawing.Regionオブジェクトがあります
{X = 0.0 Y=0.0幅=120.0高さ=120.0}
ただし、長方形を使用してExclude()メソッドを実行すると、次のようになります。
region.Exclude(New System.Drawing.Rectangle(60, -20, 100, 160))
Region.GetBoundsメソッドが返されることを期待します
{X = 0.0 Y=0.0幅=60.0高さ=120.0}
代わりに、Exclude()呼び出しは何もしないように見えます。Intersect()メソッドと同様に
region.Intersect(New System.Drawing.Rectangle(60, -20, 100, 160))
私は見ることを期待します
{X = 60.0 Y=0.0幅=60.0高さ=120.0}
しかし、ここでも変化はありません。これは正しいです?
編集:特定のコンテキスト
一般的な透過性を備えたベースコントロールの方向で、より大きなプロジェクトでOnPaintBackground()メソッドを使用しています:透過的なコントロールを作成するための一般的なソリューションは何ですか?
Protected Overrides Sub OnPaintBackground(pevent As System.Windows.Forms.PaintEventArgs)
Dim initialClip As Region = pevent.Graphics.Clip
'Develop list of underlying controls'
Dim submarinedControls As New List(Of Control)
For Each control As Control In Parent.Controls.ToArray.Reverse
If control IsNot Me AndAlso control.Visible AndAlso Me.ClientRectangle.IntersectsWith(control.RelativeClientRectangle(Me)) Then : submarinedControls.Add(control)
Else : Exit For
End If
Next
'Prepare clip for parent draw'
pevent.Graphics.Clip = New Region(initialClip.GetRegionData)
For Each control As Control In submarinedControls
pevent.Graphics.Clip.Exclude(control.RelativeClientRectangle(Me))
Next
...
End Sub
[親の再描画用にクリップを準備する]セクションで、最初のクリップが再作成された後、その境界は指定されたとおりになります。次のステップは、基になるコントロールを除外し、このコントロールが親コントロールの背景と直接相互作用する領域のみをペイントすることです。ここで確認できるexcludeメソッドは、引数として(ウォッチとして)大きな長方形を受け取りますが、Excludeが発生した後は、クリップの境界について何も変更されません。
編集:可能な解決策
Graphics.Clip領域はGraphicsオブジェクトによって管理されており、不変であるように見えます。除外スニペットを次のように置き換えると、期待されるすべての結果が得られます。
'Prepare clip for parent draw'
Dim parentClip As System.Drawing.Region = New System.Drawing.Region(initialClip.GetRegionData)
For Each Control As Control In submarinedControls
parentClip.Exclude(Control.RelativeClientRectangle(Me))
Next
pevent.Graphics.Clip = parentClip
RelativeClientRectangle():
<Runtime.CompilerServices.Extension()>
Public Function RelativeClientRectangle(control As System.Windows.Forms.Control, toControl As System.Windows.Forms.Control) As System.Drawing.Rectangle
Return New System.Drawing.Rectangle(control.RelationTo(toControl), control.Size)
End Function
に関連して():
<Runtime.CompilerServices.Extension()>
Public Function RelationTo(control As System.Windows.Forms.Control, toControl As System.Windows.Forms.Control) As System.Drawing.Point
Return control.PointToScreen(New Point(0, 0)) - toControl.PointToScreen(New Point(0, 0))
End Function