查找鼠标相对于控件而不是屏幕的位置

Find position of mouse relative to control, rather than screen

我有一个名为 BGImage 的图片框。我希望当用户点击这个时我可以捕获鼠标相对于 BGImage.

的位置

我试过使用 MousePosition,只是发现它给出了屏幕上的鼠标位置,而不是 PictureBox 上的位置。

所以我也尝试使用PointToClient:

Dim MousePos As Point = Me.PointToClient(MousePosition)

但这给了我位置 {X=1866,Y=55} 而我实际上是在 {X=516,Y=284} 左右点击了 PictureBox。

我认为问题的出现是因为我已经全屏了我的程序并将图片框的位置设置在屏幕的中心(BGImage.Location = New Point((My.Computer.Screen.WorkingArea.Width / 2) - (1008 / 2), ((My.Computer.Screen.WorkingArea.Height / 2) - (567 / 2))))

我还应该提到 PictureBox 的大小是 1008 x 567 像素,我的屏幕分辨率是 1366 x 768。

有什么方法可以让鼠标位置相对到BGImage的位置?

为您的图片框添加鼠标点击事件
然后使用MouseEventArgs获取鼠标在图片框内的位置。
这将为您提供图片框内的 X 和 Y 位置。

Dim PPoint As Point
Private Sub PictureBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseClick
    PPoint = New Point(e.X, e.Y)
    MsgBox(Convert.ToString(PPoint))
End Sub

我也遇到过同样的问题,在朋友的帮助下才解决的。 在这里看看 这是根据图片为您提供鼠标正确位置的代码。 感谢@Aaron,他已经给出了这个问题的最终解决方案。

这会在您单击的确切位置上放置一个红点。我想知道设置光标位置会有多大用处,因为它们几乎肯定会在单击按钮后移动鼠标(无意或无意)。

设置光标位置需要在屏幕坐标中 - 这会转换回客户端坐标以进行绘图。我不认为 PointToClient 对于光标位置是必需的。在下面的代码中,这是一个不必要的转换,因为您只是返回到客户端坐标。我保留它是为了显示每次转换的示例,以便您可以对它们进行试验。

Public Class Form1
Private PPoint As Point
Public Sub New()

' This call is required by the designer.
InitializeComponent()
PictureBox1.BackColor = Color.White
PictureBox1.BorderStyle = BorderStyle.Fixed3D
AddHandler PictureBox1.MouseClick, AddressOf PictureBox1_MouseClick
AddHandler Button8.Click, AddressOf Button8_Click
' Add any initialization after the InitializeComponent() call.

End Sub

Private Sub Button8_Click(sender As Object, e As EventArgs)
Dim g As Graphics = PictureBox1.CreateGraphics()
Dim rect As New Rectangle(PictureBox1.PointToClient(PPoint), New Size(1, 1))
g.DrawRectangle(Pens.Red, rect)
End Sub

Private Sub PictureBox1_MouseClick(sender As Object, e As MouseEventArgs)
PPoint = PictureBox1.PointToScreen(New Point(e.X, e.Y))
Label8.Text = PPoint.X.ToString()
Label9.Text = PPoint.Y.ToString()

End Sub
End Class

而不是使用:

Dim MousePos As Point = Me.PointToClient(MousePosition)

您应该使用:

Dim MousePos As Point = BGImage.PointToClient(MousePosition)

它将为您提供 BGImage 坐标中的鼠标位置,而第一个代码为您提供窗体坐标中的鼠标位置。