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

Vb.net 查找鼠标相对于控件而不是屏幕的位置,vb.net,winforms,screen-resolution,windows-controls,Vb.net,Winforms,Screen Resolution,Windows Controls,我有一个名为BGImage的图片框。我希望当用户单击此按钮时,我可以捕获鼠标相对于BGImage的位置 我试过使用MousePosition,结果发现它在屏幕上给出了鼠标位置,而不是在PictureBox上 因此,我还尝试使用指向客户端: Dim MousePos As Point = Me.PointToClient(MousePosition) 但这给了我位置{X=1866,Y=55},而我实际上是在{X=516,Y=284}左右点击了图片框 我认为出现问题的原因是,我已完全屏蔽了我的程序

我有一个名为
BGImage
的图片框。我希望当用户单击此按钮时,我可以捕获鼠标相对于
BGImage
的位置

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

因此,我还尝试使用
指向客户端

Dim MousePos As Point = Me.PointToClient(MousePosition)
但这给了我位置
{X=1866,Y=55}
,而我实际上是在
{X=516,Y=284}
左右点击了图片框

我认为出现问题的原因是,我已完全屏蔽了我的程序,并将PictureBox的位置设置为屏幕中心(
BGImage.Location=新点((my.Computer.screen.WorkingArea.Width/2)-(1008/2),((my.Computer.screen.WorkingArea.Height/2)-(567/2))

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


是否有任何方法可以获取相对于BGImage位置的鼠标位置?

将鼠标单击事件添加到图片框
然后使用鼠标eventargs获取图片框内的鼠标位置。
这将为您提供图片框内的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,他已经给出了这个问题的最终解决方案

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

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

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坐标中为您提供鼠标位置,而第一个代码将在窗体坐标中为您提供鼠标位置。

我以前确实尝试过这一个,但它不正确链接上的一个正确,我已经准备好尝试了