2017-08-31 71 views
0

我想在鼠標懸停在地圖上時捕獲KeyUp事件。我正在使用GMaps庫。我已經嘗試使用我的gmap控件(放置地圖的地方)的按鍵事件,keydown和keyup事件,並且我嘗試使用表單事件中的按鍵,keydown和keyup,但沒有任何反應。在VB.NET的MouseHover事件中拋出KeyUp事件

在我的表單中,我也有一些按鈕,當按下其中一個按鍵時,我看到的是焦點在按鈕之間變化,效果就好像你想用箭頭選擇一個按鈕在鍵盤上,我不知道爲什麼要這樣做,如果我在程序的關鍵事件中有特定的代碼。

在MouveHover情況下我使用這個代碼:

Private Sub GMapControl_MouseHover(sender As Object, e As EventArgs) Handles GMapControl.MouseHover 
    If Keys.Up <> Keys.None Then 
     GMapControl.Position = New PointLatLng(GMapControl.Position.Lat + 1, GMapControl.Position.Lng) 
    End If 
End Sub 

但我沒有我期待的行爲。我也想使用窗體的KeyUp事件:

Private Sub BMS_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp 
    If e.KeyCode.ToString = "Up" Then 
     GMapControl.Position = New PointLatLng(GMapControl.Position.Lat + 1, GMapControl.Position.Lng) 
    ElseIf e.KeyCode.ToString = "Down" Then 
     GMapControl.Position = New PointLatLng(GMapControl.Position.Lat - 1, GMapControl.Position.Lng) 
    ElseIf e.KeyCode.ToString = "Left" Then 
     GMapControl.Position = New PointLatLng(GMapControl.Position.Lat, GMapControl.Position.Lng - 1) 
    ElseIf e.KeyCode.ToString = "Right" Then 
     GMapControl.Position = New PointLatLng(GMapControl.Position.Lat, GMapControl.Position.Lng + 1) 
    End If 
End Sub 

而且我也試過在GMAP控制的KeyUp事件相同:

Private Sub GMapControl_KeyUp(sender As Object, e As KeyEventArgs) Handles GMapControl.KeyUp 
    If e.KeyCode.ToString = "Up" Then 
     GMapControl.Position = New PointLatLng(GMapControl.Position.Lat + 1, GMapControl.Position.Lng) 
    ElseIf e.KeyCode.ToString = "Down" Then 
     GMapControl.Position = New PointLatLng(GMapControl.Position.Lat - 1, GMapControl.Position.Lng) 
    ElseIf e.KeyCode.ToString = "Left" Then 
     GMapControl.Position = New PointLatLng(GMapControl.Position.Lat, GMapControl.Position.Lng - 1) 
    ElseIf e.KeyCode.ToString = "Right" Then 
     GMapControl.Position = New PointLatLng(GMapControl.Position.Lat, GMapControl.Position.Lng + 1) 
    End If 
End Sub 

並沒有什麼...

也許有人有一些想法做到這一點?

謝謝!

回答

0

對不起,我繼續尋找答案,我已經發現的響應什麼,我一直在尋找在此線程 https://social.msdn.microsoft.com/Forums/windows/en-US/ffeeea42-f6ba-420f-827e-74879fd29b26/how-to-detect-arrow-keys-in-vbnet?forum=winforms

通過使用屬性:

Me.KeyPreview = True 

在Load方法表單,並在窗體的KEYUP使用此代碼:

Private Sub BMS_KeyUp(sender As Object, e As KeyEventArgs) Handles MyBase.KeyUp 
    Select Case e.KeyCode 
     Case Keys.Right 
      GMapControl.Position = New PointLatLng(GMapControl.Position.Lat, GMapControl.Position.Lng + 0.1) 
      e.Handled = True 
     Case Keys.Left 
      GMapControl.Position = New PointLatLng(GMapControl.Position.Lat, GMapControl.Position.Lng - 0.1) 
      e.Handled = True 
     Case Keys.Up 
      GMapControl.Position = New PointLatLng(GMapControl.Position.Lat + 0.1, GMapControl.Position.Lng) 
      e.Handled = True 
     Case Keys.Down 
      GMapControl.Position = New PointLatLng(GMapControl.Position.Lat - 0.1, GMapControl.Position.Lng) 
      e.Handled = True 
    End Select 
End Sub 

無論如何,我想問一兩件事,我不取消derstand。我曾嘗試過這種方式,但未使用Me.KeyPreview屬性,並且未使用e.Handled = true屬性。

有人可以向我解釋爲什麼使用這兩行我有我想要的行爲,爲什麼不使用它們,我無法做到這一點?

謝謝!

+0

KeyUp事件通常只在當前擁有焦點的控件上引發。通過設置「KeyPreview = True」,表單首先獲得擊鍵。 – SSS

+0

謝謝@SSS!在這種情況下e.Handled = true有什麼作用? –

+0

'e.Handled = True'停止控制,焦點也處理'KeyUp'事件。請參閱https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=EN-US&k=k(System.Windows.Forms.Control.KeyUp);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.5.2 ); k(DevLang-VB)&rd = true – SSS