0

我有一个名为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 × 567 像素,我的屏幕分辨率是 1366 × 768。

有什么办法可以让鼠标位置对于 BGImage 的位置?

4

3 回答 3

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
于 2015-02-16T01:16:32.520 回答
0

而不是使用:

Dim MousePos As Point = Me.PointToClient(MousePosition)

你应该使用:

Dim MousePos As Point = BGImage.PointToClient(MousePosition)

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

于 2019-01-07T19:50:24.467 回答
0

我以前也遇到过同样的问题,只是在一些朋友的帮助下解决了。看看这里鼠标位置不正确 这里它的代码为您提供基于图片的鼠标的正确位置。坦克@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
于 2017-12-29T16:55:57.053 回答