鼠标位置+金额IntersectsWith按钮

问题描述:

我有光标不可见,当用户滚动按钮时,它会突出显示。问题是当用户在按钮之间时,他不知道他的光标在哪里。鼠标位置+金额IntersectsWith按钮

在鼠标离开事件中,我希望光标跳到最接近的按钮(而不是一个,他只是左)

Private Sub btnNumbers_Mouseleave(sender As System.Object, e As System.EventArgs) Handles btnAlef.MouseLeave, btnBkspc.MouseLeave, btnBack.MouseLeave, btnClearAll.MouseLeave, btnDeleteWord.MouseLeave, btnEditMenu.MouseLeave, btnUndo.MouseLeave, btnSpeak.MouseLeave, btnGimel.MouseLeave, btnZayin.MouseLeave, btnYud.MouseLeave, btnVav.MouseLeave, btnTzadik.MouseLeave, btnTuf.MouseLeave, btnTes.MouseLeave, btnSpace.MouseLeave, btnShin.MouseLeave, btnSamech.MouseLeave, btnReish.MouseLeave, btnQuestion.MouseLeave, btnPred5.MouseLeave, btnPred4.MouseLeave, btnPred3.MouseLeave, btnPred2.MouseLeave, btnPred1.MouseLeave, btnPeriod.MouseLeave, btnPercent.MouseLeave, btnOpenParen.MouseLeave, btnNun.MouseLeave, btnMem.MouseLeave, btnLetterPrediction2.MouseLeave, btnLetterPrediction1.MouseLeave, btnLamed.MouseLeave, btnKuf.MouseLeave, btnHey.MouseLeave, btnFey.MouseLeave, btnExclamation.MouseLeave, btnEnter.MouseLeave, btnEnderTzadik.MouseLeave, btnEnderNun.MouseLeave, btnEnderMem.MouseLeave, btnEnderFey.MouseLeave, btnEnderChaf.MouseLeave, btnDollar.MouseLeave, btnDaled.MouseLeave, btnCloseParen.MouseLeave, btnChes.MouseLeave, btnChaf.MouseLeave, btnBkspc.MouseLeave, btnBeis.MouseLeave, btnAyin.MouseLeave, btnApostrophe.MouseLeave, btn9.MouseLeave, btn8.MouseLeave, btn7.MouseLeave, btn6.MouseLeave, btn5.MouseLeave, btn4.MouseLeave, btn3.MouseLeave, btn2.MouseLeave, btn1.MouseLeave, btn0.MouseLeave, btnSavedPhrases5.MouseLeave, btnSavedPhrases4.MouseLeave, btnSavedPhrases3.MouseLeave, btnSavedPhrases2.MouseLeave, btnSavedPhrases1.MouseLeave, btnSettings.MouseLeave, btnPhrases.MouseLeave, btnNumbers.MouseLeave, btnMinimize.MouseLeave, btnHebrew.MouseLeave, btnExit.MouseLeave, btnCopy.MouseLeave, btnRightWord.MouseLeave, btnRightChar.MouseLeave, btnLeftWord.MouseLeave, btnLeftChar.MouseLeave, btnHome.MouseLeave, btnEnd.MouseLeave, btnT8.MouseLeave, btnT7.MouseLeave, btnT6.MouseLeave, btnT5.MouseLeave, btnT4.MouseLeave, btnT3.MouseLeave, btnT2.MouseLeave, btnT1.MouseLeave 
    Dim btn As Button = DirectCast(sender, Button) 
    btn.FlatStyle = FlatStyle.Standard 
    Dim GetCursorPos = Cursor.Position 
    If FormSettings.chbxBorderHover.Checked = True Then 
     For Each c As Control In Me.Controls.OfType(Of Button)() 
      If GetCursorPos.IntersectsWith(c.Bounds) Then 
       Cursor.Position = c.Location 
       Exit For 
      End If 
     Next 
    End If 

End Sub 

这是我到目前为止,但intercectsWith不与绘图工作点

有没有什么办法让我检查最接近的按钮是什么?

+0

改变你的逻辑来测试边界(Rect)是否包含这个点:'如果c.Bounds.Contains(Cursor.Position)'你可能必须先将光标转换成坐标首先 – Plutonix

+1

As你通过控件循环,你将不得不计算Cursor.Location和c.Bounds之间的距离并找到距离最近的那个。如果c.Bounds.Contains(Cursor.Position)那么游标已经在控件中,并且你没有任何事情要做。 – dwilliss

+0

@dwilliss我该怎么做? – Dman

我认为界面将很难使用(尤其是如果按钮是不是足够大),但这里的另一种实现方式:

Private Sub btnNumbers_Mouseleave(sender As System.Object, e As System.EventArgs) Handles btnAlef.MouseLeave, btnBkspc.MouseLeave, btnBack.MouseLeave, btnClearAll.MouseLeave, btnDeleteWord.MouseLeave, btnEditMenu.MouseLeave, btnUndo.MouseLeave, btnSpeak.MouseLeave, btnGimel.MouseLeave, btnZayin.MouseLeave, btnYud.MouseLeave, btnVav.MouseLeave, btnTzadik.MouseLeave, btnTuf.MouseLeave, btnTes.MouseLeave, btnSpace.MouseLeave, btnShin.MouseLeave, btnSamech.MouseLeave, btnReish.MouseLeave, btnQuestion.MouseLeave, btnPred5.MouseLeave, btnPred4.MouseLeave, btnPred3.MouseLeave, btnPred2.MouseLeave, btnPred1.MouseLeave, btnPeriod.MouseLeave, btnPercent.MouseLeave, btnOpenParen.MouseLeave, btnNun.MouseLeave, btnMem.MouseLeave, btnLetterPrediction2.MouseLeave, btnLetterPrediction1.MouseLeave, btnLamed.MouseLeave, btnKuf.MouseLeave, btnHey.MouseLeave, btnFey.MouseLeave, btnExclamation.MouseLeave, btnEnter.MouseLeave, btnEnderTzadik.MouseLeave, btnEnderNun.MouseLeave, btnEnderMem.MouseLeave, btnEnderFey.MouseLeave, btnEnderChaf.MouseLeave, btnDollar.MouseLeave, btnDaled.MouseLeave, btnCloseParen.MouseLeave, btnChes.MouseLeave, btnChaf.MouseLeave, btnBkspc.MouseLeave, btnBeis.MouseLeave, btnAyin.MouseLeave, btnApostrophe.MouseLeave, btn9.MouseLeave, btn8.MouseLeave, btn7.MouseLeave, btn6.MouseLeave, btn5.MouseLeave, btn4.MouseLeave, btn3.MouseLeave, btn2.MouseLeave, btn1.MouseLeave, btn0.MouseLeave, btnSavedPhrases5.MouseLeave, btnSavedPhrases4.MouseLeave, btnSavedPhrases3.MouseLeave, btnSavedPhrases2.MouseLeave, btnSavedPhrases1.MouseLeave, btnSettings.MouseLeave, btnPhrases.MouseLeave, btnNumbers.MouseLeave, btnMinimize.MouseLeave, btnHebrew.MouseLeave, btnExit.MouseLeave, btnCopy.MouseLeave, btnRightWord.MouseLeave, btnRightChar.MouseLeave, btnLeftWord.MouseLeave, btnLeftChar.MouseLeave, btnHome.MouseLeave, btnEnd.MouseLeave, btnT8.MouseLeave, btnT7.MouseLeave, btnT6.MouseLeave, btnT5.MouseLeave, btnT4.MouseLeave, btnT3.MouseLeave, btnT2.MouseLeave, btnT1.MouseLeave 
    Dim btn As Button = DirectCast(sender, Button) 
    btn.FlatStyle = FlatStyle.Standard 

    If FormSettings.chbxBorderHover.Checked = True Then 
     Dim currentPos As Point = Me.PointToClient(Cursor.Position) 
     Dim closestButton = (From x In Me.Controls.OfType(Of Button)() 
         Where x IsNot btn 
         Order By PointToButtonDistance(currentPos, x) Ascending).FirstOrDefault 
     Cursor.Position = closestButton.PointToScreen(New Point(0, 0)) 
    End If 
End Sub 

Private Function PointToButtonDistance(ByVal pt As Point, ByVal btn As Button) As Long 
    Dim center As New Point(btn.Location.X + btn.Width/2, btn.Location.Y + btn.Height/2) 
    Dim dx As Integer = Math.Max(Math.Abs(pt.X - center.X) - btn.Width/2, 0) 
    Dim dy As Integer = Math.Max(Math.Abs(pt.Y - center.Y) - btn.Height/2, 0) 
    Return dx * dx + dy * dy 
End Function 

Dim minDist As Double = Double.MaxVal 
Dim closestCtrl as Control = Nothing 
For Each c As Control In Me.Controls.OfType(Of Button)() 
    If c Is sender Then Continue For ' Skip the one we came from 

    Dim dist = ComputeDistance(Cursor.Position, c.Bounds) 
    If dist < minDist Then 
     minDist = dist 
     closestCtrl = c 
    End If  
Next 

...

' Compute distance between 2 points 
    Private Function ComputeDistance(x1 as Integer, y1 as Integer, x2 as Integer, y2 as Integer) as Double 
     Dim dx = (x1 - x2) 
     Dim dy = (y1 - y2) 
     Return Math.Sqrt(dx*dx + dy*dy) 
    End Function 

    ' Compute distance between a point and the closest corner of a rectangle 
    ' I'm going to do this a lazy way. There's probably a better one 
    Private Function ComputeDistance(pt as Point, rect as Rectangle) as Distance 
     Dim dist as New List(of Double) 
     dist.Add(ComputeDistance(pt.x, pt.y, rect.Left, rect.Top) 
     dist.Add(ComputeDistance(pt.x, pt.y, rect.Right, rect.Top) 
     dist.Add(ComputeDistance(pt.x, pt.y, rect.Left, rect.Bottom) 
     dist.Add(ComputeDistance(pt.x, pt.y, rect.Right, rect.Bottom) 
     Return dist.Min() 
    End Function 
+0

那么,现在忽略我的计算距离函数。看到Bradly在我输入我的回复时张贴了一个链接。但是找到_closes_按钮的逻辑仍然是你想要的。 – dwilliss