获取相对于控件的光标位置 - C#

41

我想获取鼠标相对于控件的位置,也就是说当我将光标放在控件的起始点(左上角)时,它应该给出(0,0)。我正在使用以下代码:

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        this.Text = Convert.ToString(Cursor.Position.X + ":" + Cursor.Position.Y);         
    } 

但是这个方法返回的位置是相对于屏幕而不是控件的。

如果有示例代码会更好。

11个回答

53

使用Control.PointToClient方法将一个点从屏幕坐标系转换为控件坐标系。如果需要反向转换,请使用PointToScreen方法。


40
你可以直接使用传递给事件处理程序的 MouseEventArgs 参数的 Location 属性。
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    Text = e.Location.X + ":" + e.Location.Y;      
} 

24
以下内容将为您提供相对于您的控件的鼠标坐标。例如,如果鼠标位于控件左上角,则结果为(0,0):
var coordinates = yourControl.PointToClient(Cursor.Position);

5

获取相对坐标和绝对坐标的方法如下:

Point Control.PointToClient(Point point);

Point Control.PointToScreen(Point point);

4
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    Text = panel1.PointToClient(Cursor.Position).ToString();    
} 

3

Cursor.Position返回屏幕上的坐标点,而Control.PointToClient(Cursor.Position)返回控件(例如控制面板)上的坐标点。在您的情况下,您有e.Locate,它会返回控件上的坐标点。


2

只需从控件的左侧和顶部坐标中减去光标位置即可:

this.Text = Convert.ToString(
    Cursor.Position.X - this.Left + ":" +
    Cursor.Position.Y - this.Top);

4
适用于顶级窗体,但不适用于其内部的控件:Control.Left 是控件相对于其父容器客户区域的位置,而不是屏幕位置。 - BrendanMcK

2
我使用MouseLocation和PointToClient来检查。然后在计时器中使用它!
bool IsMouseHover(Control c, Control container)
        {
            Point p = Control.MousePosition;
            Point p1 = c.PointToClient(p);
            Point p2 = container.PointToClient(p);
            if (c.DisplayRectangle.Contains(p1) && container.DisplayRectangle.Contains(p2))
            {
                return true;
            }
            return false;
        }

0
private void lienzo_MouseLeftButtonDown_1(object sender, MouseButtonEventArgs e)
{
    Point coordenadas = new Point();
    coordenadas = Mouse.GetPosition(lienzo);

    string msg = "Coordenadas mouse :" + coordenadas.X + "," + coordenadas.Y;
    MessageBoxResult resultado;
    string titulo = "Informacion";
    MessageBoxButton botones = MessageBoxButton.OK;
    MessageBoxImage icono = MessageBoxImage.Information;

    resultado = MessageBox.Show(msg, titulo, botones, icono);
}

其中"lienzo"是我的画布面板


0

代码段如下:

private void Control_MouseMove(object sender, MouseEventArgs e)
{
    var btn = sender as Button;
    var point = e.Location;
    point.X += btn.Location.X;
    point.Y += btn.Location.Y;

    Control findTarget = btn.Parent.GetChildAtPoint(point, GetChildAtPointSkip.Invisible) as Button;
    if (findTarget != null)
    {
        // TO DO
    }
}

这个按钮是托管面板中众多按钮之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接