【问题标题】:Panel not shows after key pressed按键后面板不显示
【发布时间】:2015-12-08 06:05:13
【问题描述】:

我遇到了一个奇怪的问题,我设置了一个“热键”来显示和隐藏帮助面板,它一直在工作,直到我按下该面板上的关闭(隐藏)按钮,之后“热键”不再起作用。我的表单上还有一个按钮,它也显示和隐藏这个面板,它一直有效,只是“热键”的问题。

这就是我为“热键”所做的。

Private Sub Me_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.H Then
        If Panel1.Visible = True Then
            Panel1.Visible = False
        ElseIf Panel1.Visible = False Then
            Panel1.Visible = True
        End If
    End If
End Sub

但是如果我只使用这个热键,我可以设置 visible = true/false 任意多次,只有在我按下面板上的任何按钮后它才会停止工作。

在设计视图中:在 panel1 - Panel1.Visible = False

  • lblMenu
  • btn关闭
  • btn重置
  • btn设置
  • btnExitToMenu
  • btnExitApp

更多代码:

Public Class Form1
Private Sub debug_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    lblMenu.Text = "Menu"
    Panel1.Visible = False
End Sub

Private Sub Me_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.H Then
        If Panel1.Visible = True Then
            Panel1.Visible = False
        ElseIf Panel1.Visible = False Then
            Panel1.Visible = True
        End If
    End If
End Sub

Private Sub btnResume_Click(sender As Object, e As EventArgs) Handles btnResume.Click
    If Panel1.Visible = True Then
        Panel1.Visible = False
    End If
End Sub

Private Sub btnRestart_Click(sender As Object, e As EventArgs) Handles btnRestart.Click
    'For restar configuration
End Sub

Private Sub btnSettings_Click(sender As Object, e As EventArgs) Handles btnSettings.Click
    'Display additional settings
End Sub

Private Sub btnExitToMenu_Click(sender As Object, e As EventArgs) Handles btnExitToMenu.Click
    Dim msg = "Are you sure you want exit to menu?"
    Dim response = MsgBox(msg, MsgBoxStyle.YesNo)
    If response = MsgBoxResult.Yes Then
        Me.Close()
    End If
End Sub

Private Sub btnExitGame_Click(sender As Object, e As EventArgs) Handles btnExitGame.Click
    Dim msg = "Are you sure you want to close this app?"
    Dim response = MsgBox(msg, MsgBoxStyle.YesNo)
    If response = MsgBoxResult.Yes Then
        Form1.Close()
    End If
End Sub

Private Sub btnMenu_Click(sender As Object, e As EventArgs) Handles btnMenu.Click
    If Panel1.Visible = True Then
        Panel1.Visible = False
    ElseIf Panel1.Visible = False Then
        Panel1.Visible = True
    End If
End Sub

结束类

这是我使用的完整代码

【问题讨论】:

  • 我有几个表格,但没有一个在这段代码中使用。此外,此表单是唯一一个不包含在窗口中的表单,因此就像您创建一个新表单一样。
  • 好的,现在我把完整的代码发给你了
  • 是的,我改了,抱歉,我试过用不同的键。我要再次将其更改为 H 再次抱歉
  • 是的,除了“btnMenu”之外的所有按钮都在隐藏的面板内。
  • 1.你想让我在 formLoad 中将 Panel1.Visible = False 更改为 True 吗? 2.无论我按面板上的哪个按钮,热键都会转到其他地方。 3. 断点是什么意思?

标签: vb.net button panel


【解决方案1】:

如果为所有其他按钮添加处理程序可以为您解决问题,则将其放入您的代码中:

当表单像这样加载时,为所有按钮添加一个处理程序:

  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For Each cntl As Control In Me.Controls
            If TypeOf cntl Is Button Then
                AddHandler DirectCast(cntl, Button).Click, AddressOf HandleMyButtonClicksPlease
            End If
        Next
    End Sub

 Private Sub HandleMyButtonClicksPlease(ByVal sender As System.Object, ByVal e As System.EventArgs)
       If Panel1.Visible = True Then
            Panel1.Visible = False
        ElseIf Panel1.Visible = False Then
            Panel1.Visible = True
        End If
    End Sub

【讨论】:

  • Form 上的按钮工作正常,问题在于按下面板上的按钮后的 e.KeyCode
  • 调试中会发生什么?
  • 错误列表没有给我任何错误、警告或消息,我也把它放在 Try Catch 中,但正如我所说,这不会抛出任何错误它只是按下一个键后什么都没有发生
  • 是的,我做到了,没有运气...但是我又发现了一些奇怪的东西...在我使用面板上的关闭按钮后,我无法使用热键,但是如果我最小化我的表单并恢复它我可以再次使用热键,但是在我使用面板上的按钮后热键再次停止工作......我想记录一下并从 youtube 上向你展示这个东西
  • 阅读此homeandlearn.co.uk/NET/nets10p3.html 尝试使用对象 ID 切换 Me。
【解决方案2】:

好的,这就是我的工作方式

        Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
        Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer) As Integer
        Public Const WM_HOTKEY As Integer = &H312
        Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
            If m.Msg = WM_HOTKEY Then
                TextBox1.Text = m.LParam '<-- 2. After you run the form press the key you set in 1. and copy it
            End If
            If m.LParam = 4718592 Then  '<-- 3. paste this here to use wanted key
                    If Panel1.Visible = True Then
                        Panel1.Visible = False
                    ElseIf Panel1.Visible = False Then
                        Panel1.Visible = True
                    End If
            End If
            MyBase.WndProc(m)
        End Sub
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Call RegisterHotKey(Me.Handle, 9, 0, Keys.H) '<-- 1. Add a key what you want to use
        End Sub

        Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            UnregisterHotKey(Me.Handle.ToInt32, 0)
        End Sub

感谢 tezzo

【讨论】:

    【解决方案3】:

    我只是不相信它这么简单,我早些时候发现这是一个焦点问题。所以代码可以是这样的:

        Private Sub Me_LostFocus(sender As Object, e As EventArgs) Handles Me.LostFocus
            Me.Focus()
        End Sub
    

    【讨论】:

      猜你喜欢
      • 2023-01-11
      • 1970-01-01
      • 2017-02-21
      • 2012-10-05
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多