如何在图片框中的两个点之间获得鼠标坐标

时间:2017-12-18 00:03:48

标签: c# winforms visual-studio

有人可以帮我吗?

我有一个带有图像的图片框,这个图像有一些坐标。 我的X从60开始到135结束 我的Y统计数据为75,结束时为120

因为我只有第一个和最后一个点,所以当我将鼠标悬停在图像上时,我想计算并查看坐标。

我开始解决我的第一个问题:我必须划定我的开始和结束。 所以我尝试了一个跟踪栏。

我首先尝试获取当前的X位置:

将我的图片框设置在位置x = 0;

将我的轨迹栏设置在x = -10的位置,这样我的第一个引脚就位于0位置;

设置我的tracbar size.x = picturebox.x + 20,所以我的最后一个图钉将位于图片框的末尾。

我的自定义栏具有当前属性: 最小值= 60,最大值= 135;

在我的图片框中设置鼠标移动事件:

 private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        double dblValue;
        dblValue = ((double)e.X/ (double)trackBar1.Width) * (trackBar1.Maximum - trackBar1.Minimum);
        dblValue = dblValue + 60;
        trackBar1.Value = Convert.ToInt32(dblValue);
        lblX.Text = dblValue.ToString();
    }

它几乎正常工作,但仍然不太准确。 任何人都有一些可能有用的想法吗?

1 个答案:

答案 0 :(得分:0)

我不确定你要做的是什么,但是如果你想要到达图片框内的坐标,那么pictureBox类上有一个名为PointToClient(Point)的函数来计算指定屏幕的位置指向客户端坐标。您可以使用MouseEventArgs中的X和Y坐标创建要传递给函数的Point对象。

澄清:

X事件中Y的{​​{1}}和MouseEventArgs属性是屏幕左上角的屏幕坐标(0,0)。< / p>

MouseMove控件之类的许多控件都包含一个PictureBox方法,它将屏幕坐标转换为本地控件的坐标,其中(0,0)将位于左上角控制。

因此,例如,如果您的控件放在屏幕上的位置(60,75)并且右下角坐标为(135,120)。如果您的鼠标位于控件之上,并且距离左侧10个像素,距离顶部20个像素,那么MouseMove事件中MouseEventArgs的PointToClientX属性将为:{{1} } = 70和Y = 95.如果使用X将这些转换为图片框控件的内部坐标,则表示Y = 10且PointToClient = 20

现在,如果你想让X显示一个相对指示鼠标的X坐标在某个控件上的位置,你可以按如下方式计算:

Y

如果您想让轨迹栏使用屏幕坐标来跟踪鼠标的X坐标相对于某个控件的相对位置,您可以按如下方式计算:

TrackBar

如果您想让轨迹栏使用某个控件的内部坐标来跟踪鼠标在该控件上的X坐标的内部位置,您可以按如下方式计算:

// Set the minimum and maximum of the trackbar to 0 and 100 for a simple percentage.
trackBar1.Minimum = 0;
trackBar1.Maximum = 100;

// In the pictureBox1_MouseMove event have the following code:
trackBar1.Value = pictureBox1.PointToClient(new Point(e.X, e.Y)).X * 100 / pictureBox1.Width;

现在,有一点需要注意,那就是如果你将控件放在其他控件中,比如面板内面板中的面板等,那么“世界”就是这样。另一个控件内部控件的坐标基于它们在父控件中的位置。这就是为什么通过// Set the minimum and maximum values of the track bar to the screen coordinates of the // control we want to track. trackBar1.Minimum = pictureBox1.PointToScreen(0,0).X; trackBar1.Maximum = pictureBox1.PointToScreen(pictureBox1.Width, 0).X; // In the pictureBox1_MouseMove event have the following code: trackBar1.Value = e.X; 使用控件的内部坐标和通过// Set the minimum and maximum values of the track bar to zero and the width of the // control we want to track. trackBar1.Minimum = 0; trackBar1.Maximum = pictureBox1.Width; // In the pictureBox1_MouseMove event have the following code: trackBar1.Value = pictureBox1.PointToClient(new Point(e.X, e.Y)).X; // or - not recommended - read below. trackBar1.Value = e.X - pictureBox1.Left; 从内部坐标使用屏幕坐标是个好主意,因为否则你必须通过所有容器向上工作直到你到达了屏幕,一直跟踪PointToClientPointToScreen坐标。

我希望这能回答你的问题。