2

我有一个 MouseEnter 事件,它当前处理我表单上的一些自定义控件。该程序是一个纸牌游戏。我有一个集合(handCards),当用户画一张卡片时会填充它,然后它将最新的卡片添加到表单中。这个集合包含各种自定义类型的卡片,所有这些卡片都继承自 picturebox。从牌组中抽出卡片并将它们添加到表格中效果很好。我遇到的麻烦是,在运行时,在卡片被绘制并添加到表单后,我创建了一个 addhandler 代码行来让这些卡片响应我的 MouseEnter 事件,但是我的 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作为索引将不起作用,因为它是项目的总数,因为您的索引从零开始,并且比计数少一。handCards(handCard.Count)应该是这样handCards(handCards.Count -1)

于 2012-05-28T00:31:35.993 回答
1

所以这就是我修复它的方法,以防有人遇到这篇文章。制作了一个单独的 Sub 来执行 AddHandler。程序抽出一张卡片后,它会调用此方法,然后添加我需要的 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

您可以使用泛型集合来避免类型转换。

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数组的元素,因为PictureBox派生自Controlwhich 实现MouseEnter事件。

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

幸运的是,我正在解决这个问题,并且成功地完成了这个解决方案。

首先添加事件处理程序方法您希望的任何地方,为了测试我已经在 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 回答