2012-11-10 2 views
4

나는 시각적 인 기본 과정을위한 게임을 만들고 있습니다. 클릭하면 여러 개의 그림 상자가 숨겨진 이미지를 개별적으로 표시합니다. 게임의 요점은 일치하는 그림을 찾는 것입니다 (충분히 간단합니다).동일한 Sub로 여러 번의 클릭 이벤트를 처리하는 방법

가장 쉬운 단계는 16 개의 그림 상자가 있습니다. 어려움이 커질수록 그림 상자 수가 증가합니다. 다음과 같이

Private Sub pictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pictureBox1.Click 

내부, 나는, 그림 상자에 이미지를 변경하려면이 옵션을 사용하려면 : (비주얼 스튜디오에 의해 생성 기본값)를 다음과 같이 각각의 그림 상자를 들어

, 나는 현재 이벤트 처리기를 :

pictureBox1.Image = (My.Resources.picture_name) 
내가 대신 16 별도의 핸들러를 필요없이, 적절한 그림 상자를 하나의 서브 ALL 버튼 클릭을 처리 있고, 변경할 수있는 방법이 있는지 알고 싶습니다

.

Private Sub pictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
    Handles pictureBox1.Click, pictureBox2.Click, pictureBox3.Click, ... pictureBox16.Click 

그리고 다음을 수행하십시오 : 예를 들어

여기
' Change appropriate picture box 

는 (지금)의 모습입니다 :
enter image description here

답변

5

가 PictureBox를 방금에이 클릭 된 찾으려면 보낸 사람 변수를 살펴보십시오. 분명히 당신은 PictureBox를 유형 개체 유형으로 변환 할 수 있습니다

Dim ClickedBox As PictureBox 

ClickedBox = CType(sender, PictureBox) 
2

개인적으로 난 당신이 원하는하지 않는 인덱스에 대한 각각의 PictureBox Tag을, 당신의 PictureBox에 공통 이벤트 핸들러를 첨부 제공하는 것 어떻게 할 것인지 이름에 대한 선택을 할 수 있습니다. 그런 다음 당신은 이런 일을합니다.

Private Sub PictureBox1_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox1.Click, PictureBox2.Click, ... 
    Dim pb As PictureBox = CType(sender, PictureBox) 

    Select Case CInt(pb.Tag) 
     Case 0 
      pb.Image = My.Resources.PictureName1 

     Case 1 
      pb.Image = My.Resources.PictureName2 

      ... 
    End Select 
End Sub 
0

내가 읽은에 따르면, DirectCast가에서는 CType

선호한다 DirectCast는 다음과 같이 '와/끝'과 결합 될 수

: 나는 시도했다

Private Sub PictureBox1_Click(sender As System.Object, e As System.EventArgs) Handles PictureBox1.Click, PictureBox2.Click, ... 
    With DirectCast(sender, PictureBox) 
     Select Case CInt(.Tag) 
      Case 0 
       .Image = My.Resources.PictureName1 
      Case 1 
       .Image = My.Resources.PictureName2 
       ... 
     End Select 
    End With 
End Sub 

다음은 또한 이상한 문제 (통제가 사라짐)를 유발합니다. 예를 들어 모든 제어를 통해

Using cbMe as CheckBox = DirectCast(sender, CheckBox) 
    cbMe.Checked = True 
End Using 
0

대하여 반복

For Each ctr As Control In Me.Controls 
     If TypeOf ctr Is PictureBox Then 
      If ctr Is ActiveControl Then 
       ' Do Something here 
      End If 
     End If 
    Next 
관련 문제