我如何将 keyUp/keyDown 事件传递给 visual basic 中的面板?

How do i pass keyUp/keyDown events to panel in visual basic?

我用 visual basic 创建了一个游戏,并决定通过在游戏中添加多个房间来扩展。每个房间都将是一个面板,显示用户何时进入某个区域。首先,我创建了一个继承面板属性的 class,然后将其添加到我的主窗体中。然后我将所有项目添加到面板控件。我的问题是当它在面板控件中时我无法控制播放器。我已经尝试了各种方法,但无法正常工作。

我做了一些阅读,发现面板没有 keyUp() 和 keyDown() 事件。但是,我想知道是否有解决办法。

提前致谢!

mainRoom() 代码class(我的面板):

Public Class mainRoom
    Inherits Panel

    Sub New()
        With Me
            .SetBounds(0, 0, Form1.Width, Form1.Height)
            .SendToBack()
        End With
    End Sub

    Public Sub mainRoom_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Me.Paint
        e.Graphics.FillRectangle(Brushes.DarkOrange, block)
    End Sub
End Class

主要形式class:

Sub setMap()
    main = New mainRoom()
    Me.Controls.Add(main)
End Sub

可以在主窗体上设置KeyPreview=True,然后从窗体中处理关键的up/down事件:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.KeyPreview = True
End Sub

Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
    'key down code.
    e.Handled = True
End Sub

Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp
    'key up code.
    e.Handled = True
End Sub

注意:如果您不希望其他控件的键 up/down 事件处理程序在您的表单事件处理程序执行后触发,请像我在上面的示例中那样设置 e.Handled=True

有关 KeyPreview 的详细信息,请参阅 MSDN

注意 - 当通过 IDE 将现有控件从表单移动 (cut/paste) 到新的面板控件时,事件处理程序不会被传递,因为它们成为父控件的子控件 (新面板)。所以会发生这种情况:

    Private Sub Button1_Click(sender As Object, e As EventArgs)

重新添加事件处理程序,不要花很长时间在谷歌上搜索为什么面板中的按键事件突然停止触发...

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click