2012-08-01 75 views
0

我有一個PictureBox控件。當我點擊控件上的圖像時,事件處理程序被觸發。如何處理ArgumentOutOfRangeException?

這裏是事件處理程序:

Private Sub pbImageHolder_Click(ByVal sender As Object, _ 
           ByVal e As EventArgs) Handles pbImageHolder.Click 

    Dim clickPoint As Point = MousePosition 
    Dim img As Bitmap = New Bitmap(pbImageHolder.Image) 
    pixelColor = img.GetPixel(clickPoint.X, clickPoint.Y) 

    For i As Integer = 0 To img.Width 
    For j As Integer = 0 To img.Height 

    Next 
    Next 
End Sub 

的問題是,我此行中得到:

pixelColor = img.GetPixel(clickPoint.X, clickPoint.Y) 

這是例外:

System.ArgumentOutOfRangeException了未處理
消息=參數必須爲正,並且寬度爲<。

參數名稱:X
PARAMNAME = X
源= System.Drawing中

任何想法,我怎麼能修復代碼?

回答

1

假設SizeMode是默認的Normal(見下面Hans的評論),MouseClick事件將是一個更合適的事件來處理,而不是點擊,因爲它會傳遞鼠標位置給你。

此外,您需要檢查點是否在圖像的範圍內。

Private Sub pbImageHolder_MouseClick(ByVal sender As Object, _ 
            ByVal e As MouseEventArgs) _ 
            Handles pbImageHolder.MouseClick 

    Using img As Bitmap = New Bitmap(pbImageHolder.Image) 
    If New Rectangle(Point.Empty, img.Size).Contains(e.Location) Then 
     pixelColor = img.GetPixel(e.Location.X, e.Location.Y) 
     For i As Integer = 0 To img.Width - 1 
     For j As Integer = 0 To img.Height - 1 

     Next 
     Next 
    End If 
    End Using 
End Sub 

對於循環,一定要比寬度和高度少一個。

除非您不知道範圍,否則您不應該需要嘗試 - 捕獲此錯誤,但在此情況下,您知道該範圍與圖像大小有關。

+0

PictureBox.SizeMode混淆了這段代碼。正如它與OP一樣。 – 2012-08-01 21:13:58

+0

@HansPassant好點。 OP也使用MousePosition - 這不可能是好事。 – LarsTech 2012-08-01 21:19:18

0

防禦性編程(測試空值和超出範圍變量值)和使用適當的try/catch塊的組合(如果您想要嘗試「修復」它,您甚至可以使用catchArgumentOutOfRangeException例外,如果您的防禦策略'失敗')。