0

PictureBox コントロールがあります。コントロールの画像をクリックすると、イベント ハンドラーが発生しました。

イベント ハンドラは次のとおりです。

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
Source=System.Drawing

どうすればコードを修正できますか?

4

2 に答える 2

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

ループの場合は、必ず幅と高さより 1 つ小さくしてください。

範囲がわからない場合を除き、このエラーに対して Try - Catch は必要ありませんが、この場合、範囲が画像のサイズに関連付けられていることがわかっています。

于 2012-08-01T20:45:34.560 に答える
0

防御プログラミング (null と範囲外の変数値のテスト) と適切な try/catch ブロックの使用 (防御戦術が「失敗」した場合に例外を「修正」しようとする場合catchは、例外自体を使用することもできます) の組み合わせ。ArgumentOutOfRangeException

于 2012-08-01T20:46:36.340 に答える