2012-08-22 92 views
0

我與的getBounds)一個System.Drawing.Region對象(方法返回這是Region.Exclude行爲是否正確?

{X = 0.0 Y = 0.0寬度= 120.0高度= 120.0}

然而,當我執行排除()方法用一個矩形:

region.Exclude(New System.Drawing.Rectangle(60, -20, 100, 160)) 

我期望Region.GetBounds方法返回

{X = 0.0 Y = 0.0寬度= 60.0高度= 120.0}

代替排除()調用似乎什麼也不做。類似地相交()方法

region.Intersect(New System.Drawing.Rectangle(60, -20, 100, 160)) 

我希望看到

{X = 60.0 Y = 0.0寬度= 60.0高度= 120.0}

但同樣沒有更改。它是否正確?

編輯:具體上下文

我與OnPaintBackground()方法在更大的項目的工作與一般透明度鹼控制的方向:What is a general solution to creating a transparent control?

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 

在「準備剪輯父級重繪「部分,在初始剪輯重新創建後,其邊界如指定。下一步是排除任何底層控件,並僅將該控件直接與父控件的背景進行交互的區域繪製。我可以看到的排除方法是接收較大的矩形作爲其參數(作爲Watch),但在排除發生後,剪輯邊界沒有任何變化。

編輯:可能的解決

看樣子Graphics.Clip區域由圖形管理對象,是不可改變的。用下面的產量更換排除片段所有預期成果:

'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 

對於relativeTo():

<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 
+0

工作正常,當我嘗試它。但是我看不到原始區域是什麼樣子,以及您使用的是什麼樣的Graphics上下文。郵政編碼,重現問題。 –

+0

我已經添加了我的具體上下文。我正在處理圖形轉換,雖然我無法想象這會影響圖形對象引用的區域上的排除方法。 –

+0

不確定。但是Clip並沒有在OnPaintBackground()覆蓋開始時被初始化。這是「無限」。添加'Dim rc = initialClip.GetBounds(pevent.Graphics)'來看看。 –

回答

0

雖然我不能肯定,所有的工作似乎都與我的最終編輯一致,即Graphics.Clip的管理比孤立的區域更嚴格。在準備離線修改區域時,觀察到的行爲將得到完全解決。