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

问题描述 投票:0回答:1

谁可以帮我这个事?

我有一个带图像的图片框,这个图像有一些坐标。我的X从60开始,结束于135 My Y stats at 75 and end at 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();
    }

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

c# winforms visual-studio
1个回答
0
投票

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

澄清:

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

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

因此,例如,如果您的控件放在屏幕上的位置(60,75)并且右下角坐标为(135,120)。如果您的鼠标位于控件上方,并且距离左侧10个像素,距离顶部20个像素,那么MouseMove事件中MouseEventArgs的XY属性将为:X = 70和Y = 95.如果转换这些使用PointToClient到picturebox控件的内部坐标,它将指示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一直协调。

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

© www.soinside.com 2019 - 2024. All rights reserved.