Visual Basic - событие до нажатия клавиши - PullRequest
0 голосов
/ 11 октября 2018

Прежде всего, я действительно сожалею о расплывчатом названии.Я довольно хорошо знаю, что такое переполнение стека, и я не знаю, как сформулировать этот вопрос.Я хочу, чтобы при нажатии клавиши (скажем, стрелка вверх) я хотел переместить графический блок по всей форме окна, пока он не столкнется с отдельным графическим блоком.Вот мой код.

Private Async Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    Select Case e.KeyCode
        Case Keys.Left
            Me.pBox1.Left -= 20
        Case Keys.Up
            Me.pBox1.Top -= 20
        Case Keys.Right
            Me.pBox1.Left += 20

        Case Keys.Down
            Me.pBox1.Top += 20

    End Select

Это не весь код, а важная часть.По сути, при нажатии клавиши окно изображения перемещается по форме.Но я должен постоянно удерживать ключ, чтобы он двигался.Я хочу нажать клавишу и заставить окно изображения перемещаться по экрану, пока оно не коснется другого окна изображения.

PS У меня уже есть код столкновения.(pBox1.Bounds.IntersectsWith (pBox2.Bounds)) Пожалуйста, имейте в виду, что я достаточно хорошо знаком с Visual Basic и переполнением стека.

1 Ответ

0 голосов
/ 11 октября 2018

вы можете создать подпрограмму, которая будет содержать движущееся изображение, а также логику обнаружения.вызовите его изнутри Form1_keyDown ().Основные моменты, которые следует запомнить:

  1. используйте цикл для имитации инструкции перемещения при щелчке.
  2. используйте thread.sleep для создания эффекта задержки
  3. во время движения Picturebox, используйтеФлаг inTheMiddleOfMoving, чтобы убедиться, что нажатие любых клавиш со стрелками не имеет никакого эффекта (выход из подпрограммы).
  4. выход из цикла либо при нажатии на picturebox2, либо ожидание определенного промежутка времени (это важно)

    Select Case e.KeyCode
        Case Keys.Left
            MovePictureBox(pbox1, pbox2, 20, KeyMovingDirection.Left)
    ...
    
    Public Enum KeyMovingDirection
      Left
      Right
      Top
      Bottom
    End Enum
    
    
    Private inTheMiddleOfMoving As Boolean = False
    Public Sub MovePictureBox(pbox1 As PictureBox, pbox2 As PictureBox, stepA 
       As Integer, direction As KeyMovingDirection)
    
      If inTheMiddleOfMoving Then Exit Sub
    
      Dim collided As Boolean = False
      Dim t As New Stopwatch
      t.Start()
      Do
        Select Case direction
            Case KeyMovingDirection.Left
                pbox1.Left -= stepA
            Case KeyMovingDirection.Right
                pbox1.Left += stepA
            Case KeyMovingDirection.Top
                pbox1.Top -= stepA
            Case KeyMovingDirection.Bottom
                pbox1.Top += stepA
        End Select
        inTheMiddleOfMoving = True
    
        Threading.Thread.Sleep(200)
        If pbox1.Bounds.IntersectsWith(pbox2.Bounds) OrElse t.ElapsedMilliseconds > 5000 Then
            '...
            collided = True
        End If
      Loop Until collided
      t.Stop()
       inTheMiddleOfMoving = False
     End Sub
    
...