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

时间:2015-02-15 20:56:08

标签: vb.net winforms screen-resolution windows-controls

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

我尝试使用MousePosition,但发现它只是在屏幕上显示鼠标位置,而不是在PictureBox上。

所以我也尝试使用PointToClient

Dim MousePos As Point = Me.PointToClient(MousePosition)

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

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

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

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

3 个答案:

答案 0 :(得分:0)

将鼠标单击事件添加到图片框中 然后使用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

答案 1 :(得分:0)

我遇到过同样的问题,并在一些朋友的帮助下解决了。 看看这里mouse position is not correct 这里的代码为您提供基于图片的鼠标的正确位置。 坦克到@Aaron他已经给出了这个问题的最终解决方案。

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

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

List.foldl(
  list, 
  (1, map), 
  fn(l, (i, map)) -> (i+1, Map.update(map, :some_key, $(i)))
)

答案 2 :(得分:0)

代替使用:

Dim MousePos As Point = Me.PointToClient(MousePosition)

您应该使用:

Dim MousePos As Point = BGImage.PointToClient(MousePosition)

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