DOBON.NET DOBON.NETプログラミング掲示板過去ログ

クリックされたPictureBoxを取得したい

環境/言語:[OS : Windows XP Professional / 言語 : Visual Basic .NET / .NET Framework : 2.0]
分類:[.NET]

【解決したい問題】

フォーム上に30〜40ケの別々のイメージを表示したPictureBoxを配置しています。
ある1つのPictureBoxをクリックしたときに、クリックされたPictureBoxを取得したい。
Private Sub PictureBox1_Click(ByVal sender〜
  共通処理(クリックされたPictureBox)
End Sub

Sub 共通処理(ByVal MyPictureBox As PictureBox)
Dim DestImage As Image = MyPictureBox.Image
Dim g As Graphics = Graphics.FromImage(DestImage)
以下 処理
MyPictureBox.Image = DestImage
End Sub
クリックしたコントロール名をそのまま書かずに取得したい

【解決するために何をしたか】

PictureBoxはアクティブにすることのできないコントロールの為
  Me.ActiveControl
  Screen.ActiveControl
は使えず私がフリーズを起こしています

【追加事項】

Access VBAの経験しかなく今回はじめてのVB2005の為 クラス 継承等
ほとんど理解していません。
■No21469に返信(sf_cb_1300さんの記事)

間違っているかも知れませんが、雰囲気は伝わるかなと

Form_Load
AddHandler PictureBox1.Click, AddressOf PictureBox_Click

AddHandler PictureBox40.Click, AddressOf MyPictureBox_Click

Private Sub MyPictureBox_Click(ByVal sender〜

Dim DestImage As Image = CType(sender,PictureBox).Image
Dim SortImage As Image = DestImage
Dim g As Graphics = Graphics.FromImage(DestImage)
以下 処理
SortImage.Image = DestImage
End Sub

イベントとプロシージャを動的に結びつける
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard10.htm
> ある1つのPictureBoxをクリックしたときに、クリックされたPictureBoxを取得したい。
> Private Sub PictureBox1_Click(ByVal sender〜
>   共通処理(クリックされたPictureBox)
> End Sub

イベントの引数senderはそのイベント発生の元になったオブジェクトがセットされますので、Clickイベントの処理で、

共通処理(DirectCast(sender, PictureBox))

とすればよいと思います。
#お聞きになりたいポイントをはずしてそうな気がしますが・・・(^^;
やじゅ様、よねKEN様 お返事ありがとうございました
御報告遅くなりまして申し訳ありませんでした。
教えていただいたことを元に、思いどうりの動き(コードの簡略)になりました

Private Sub PictureBox1_Click(ByVal sender As System.Object,ByVal e
As System.EventArgs) Handles PictureBox1.Click
Call 共通処理(DirectCast(sender, PictureBox))'まったくおなじコード
End Sub

Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles PictureBox2.Click
Call 共通処理(DirectCast(sender, PictureBox))
End Sub

Private Sub PictureBox3_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles PictureBox3.Click
Call 共通処理(DirectCast(sender, PictureBox))
End Sub

  以下かなりの数のPictureBoxも同様


Sub 共通処理(ByVal MyPictureBox As PictureBox)
Dim DestImage As Image = MyPictureBox.Image
Dim g As Graphics = Graphics.FromImage(DestImage)
Dim Attr As New Imaging.ImageAttributes
Dim Maps(0) As Imaging.ColorMap
Maps(0) = New Imaging.ColorMap
Maps(0).OldColor = Color.Blue '置換前の色に「青」を指定
Maps(0).NewColor = Color.Red '置換後の色に「赤」を指定
Attr.SetRemapTable(Maps)

g.DrawImage(DestImage, New Rectangle(New Point, DestImage.Size),
0, 0, DestImage.Width, DestImage.Height,
GraphicsUnit.Pixel, Attr)

MyPictureBox.Image = DestImage
End Sub


ありがとうございました
解決済み!
> Private Sub PictureBox1_Click(ByVal sender As System.Object,ByVal e
> As System.EventArgs) Handles PictureBox1.Click
> Call 共通処理(DirectCast(sender, PictureBox))'まったくおなじコード
> End Sub
>
> Private Sub PictureBox2_Click(ByVal sender As System.Object, ByVal e
> As System.EventArgs) Handles PictureBox2.Click
> Call 共通処理(DirectCast(sender, PictureBox))
> End Sub
>
> Private Sub PictureBox3_Click(ByVal sender As System.Object, ByVal e
> As System.EventArgs) Handles PictureBox3.Click
> Call 共通処理(DirectCast(sender, PictureBox))
> End Sub
>

まったく同じ処理しかしないのであれば、

Private Sub PictureBox_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles PictureBox1.Click, PictureBox2.Click, PictureBox3.Click
Call 共通処理(DirectCast(sender, PictureBox))
End Sub

のように同じイベントハンドラのHandles句にPictureBox1.Click, PictureBox2.Click, PictureBox3.Click, ・・・のように並べて指定することもできます。
参考までに。
解決済み!
> のように同じイベントハンドラのHandles句にPictureBox1.Click, PictureBox2.Click, PictureBox3.Click, ・・・のように並べて指定することもできます。
> 参考までに。
よねKEN 様 更なるご教授ありがとうございました。
VBAしか知らない僕にとって大変参考になります。
イベントハンドラの便利な部分を、適所で応用させていただきます。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板