2

現在、フォームのカスタムコントロールを処理するMouseEnterイベントがあります。プログラムはカードゲームです。ユーザーがカードを描画し、フォームに最新のカードを追加すると入力されるコレクション(handCards)があります。このコレクションには、pictureboxから継承したさまざまなカスタムタイプのカードが含まれています。デッキからカードを引き出してフォームに追加するとうまくいきます。私が抱えている問題は、実行時に、カードが描画されてフォームに追加された後、それらのカードがMouseEnterイベントに応答するように、コードのaddhandler行を作成しましたが、コードのaddhandler行は次のように指示しています。 MouseEnterはオブジェクトのイベントではありません。カードが描画されてフォームに追加された後、マウスが新しいカスタムコントロールに入ると、MouseEnterイベントが発生するようにするには、どうすればよいですか?ここ'

deck.DrawCard()
AddHandler handCards(handCards.Count).MouseEnter, AddressOf Cards_MouseEnter

PS MouseEnterイベントは、実行前にフォーム上にあるカスタムコントロールに対して正常に機能し、コントロールの画像を取得して、画像をフォーム上のより大きなカードに配置することで拡大するだけです。

4

4 に答える 4

1

あなたのhandCardsコレクションはオブジェクトコレクションだと思います。次のように、CTypeを使用して適切なタイプにキャストしてみてください。

AddHandler CType(handCards(handCards.Count), PictureBox).MouseEnter, AddressOf Cards_MouseEnter

@Jasonが述べたhandCards.Countように、インデックスとしてを使用すると、アイテムの総数であるため機能しません。インデックスはゼロベースであり、カウントより1つ少なくなります。そうhandCards(handCard.Count)あるべきですhandCards(handCards.Count -1)

于 2012-05-28T00:31:35.993 に答える
1

型キャストを回避するために汎用コレクションを使用できます。

Private handCards As System.Collections.Generic.List(Of PictureBox) _
    = New System.Collections.Generic.List(Of PictureBox)(52)

またはPictureBox、オブジェクトの配列を使用することもできます

Private handCards(5) As PictureBox

PictureBoxただし、配列の各要素にオブジェクトを割り当てることにより、コレクションまたは配列を初期化する必要があることに注意してください。

これで、派生がイベントを実装するPictureBoxため、配列の要素にハンドラーを追加できます。PictureBoxControlMouseEnter

deck.DrawCard()
If handCards.Count > 0 andAlso handCards.Last() IsNot Nothing then
    AddHandler handCards.Last().MouseEnter, AddressOf Cards_MouseEnter
End If

ハンドラーは次のようになります

Private Function Cards_MouseEnter(sender As Object, e As System.EventArgs) As Object
    ' Handle mouse events here
End Function
于 2012-05-28T01:05:46.837 に答える
1

誰かがこの投稿に出くわした場合に備えて、これが私が修正した方法です。AddHandlerを実行するために別のSubを作成しました。プログラムがカードを引くと、このメソッドが呼び出され、必要なMouseEnterハンドラーが追加されます。ByValが鍵でした。もともとはByRefを使うことになっていたと思っていましたが、違います。MouseEnterは制御のイベントですが、明らかにObjectではないため、機能するようになりました。

Public Sub addHandlers(ByVal inputObject As Control)
    AddHandler inputObject.MouseEnter, AddressOf Cards_MouseEnter
End Sub
于 2012-05-28T03:13:39.480 に答える
1

幸いなことに、私は回避策を講じていて、このソリューションを成功させることができました。

最初にイベントハンドラーメソッドを追加します。必要に応じて、テスト用にButton_Clickにこの関数を追加しました。

addHandlers(Label1) 'Label one is the control on which I have to attach Mouse Events (Enter,LEave)

「addHandlers」関数の実装になりました

 Public Sub addHandlers(ByVal obj1 As Control)
    AddHandler obj1.MouseEnter, AddressOf MouseEventArgs
    AddHandler obj1.MouseLeave, AddressOf _MouseLeave
 End Sub

今マウスイベント:

Private Function _MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) As Object
    Try
        Me.Cursor = Cursors.Default
    Catch ex As Exception

    End Try

End Function

Private Function MouseEventArgs(ByVal sender As Object, ByVal e As System.EventArgs) As Object
    Try
        Me.Cursor = Cursors.Hand
    Catch ex As Exception

    End Try
End Function
于 2014-10-23T05:28:18.983 に答える