【问题标题】:How to get mouse coordinates between two points in a picture box如何获取图片框中两点之间的鼠标坐标
【发布时间】:2017-12-20 12:01:26
【问题描述】:

谁能帮我解决这个问题?

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

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

我从解决我的第一个问题开始:我必须界定我的开始和结束。 所以我尝试了一个轨迹栏。

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

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

将我的轨迹栏设置在位置 x = -10,所以我的第一个图钉将位于位置 0;

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

我的轨迹栏具有当前属性: 最小值 = 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();
    }

它几乎可以工作,但仍然不是很准确。 有人有一些可行的想法吗?

【问题讨论】:

    标签: c# winforms visual-studio


    【解决方案1】:

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

    澄清一下:

    MouseMove 事件中MouseEventArgsXY 属性是屏幕左上角的屏幕坐标(0,0)。

    PictureBox 控件这样的许多控件都包含一个PointToClient 方法,它将屏幕坐标转换为本地控件的坐标,其中(0,0) 将是控件的左上角。

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

    现在,如果您想要一个 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;
    

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

    // 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;
    

    如果您想让轨迹栏使用某个控件的内部坐标来跟踪鼠标在该控件上的 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;
    

    现在,有一个警告,那就是如果您将控件放在其他控件中,例如将面板放在面板中的面板中,等等。那么另一个控件中的控件的“世界”坐标是基于它们的父控件中的位置。这就是为什么通过PointToClient 使用控件的内部坐标和通过PointToScreen 使用内部坐标的屏幕坐标是一个好主意的原因,因为否则您将不得不向上遍历所有容器,直到到达屏幕,一直跟踪TopLeft 坐标。

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

    【讨论】:

    • PointToClient 将计算 0 到 X。我想给出第一个和最后一个坐标,并计算两者之间的值。我的图像不是从 x = 0 开始,而是 x = 60;
    • 那不就是窗口坐标吗?我将编辑我的答案以澄清,也许它会回答你的问题。
    猜你喜欢
    • 2021-05-31
    • 2016-05-10
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多