0

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
4

1 に答える 1

0

確かではありませんが、すべての作業は、Graphics.Clipが孤立した領域よりも厳密に管理されているという私の最終的な編集に同意しているようです。変更のためにリージョンをオフラインで準備すると、観察された動作は完全に解決されます。

于 2012-08-24T03:13:19.797 に答える