Получить позицию курсора по отношению к элементу управления - C # - PullRequest
29 голосов
/ 20 ноября 2011

Я хочу получить положение мыши относительно элемента управления, в котором присутствует указатель мыши. Это означает, что когда я помещаю курсор в начальную точку (верхний левый угол) элемента управления, он должен давать (0,0). Я использую следующий код:

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

Но это дает положение относительно экрана, а не элемента управления.

Пример кода будет оценен.

Ответы [ 8 ]

41 голосов
/ 20 ноября 2011

Используйте Control.PointToClient , чтобы преобразовать точку из относительных к экрану координат в управляющие относительно координат.Если вам нужно пойти другим путем, используйте PointToScreen.

27 голосов
/ 20 ноября 2011

Вы можете напрямую использовать свойство Location аргумента MouseEventArgs, передаваемого вашему обработчику событий.

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    Text = e.Location.X + ":" + e.Location.Y;      
} 
15 голосов
/ 13 октября 2014

Следующее даст вам координаты мыши относительно вашего контроля.Например, это приводит к (0,0), если мышь находится над левым верхним углом элемента управления:

var coordinates = yourControl.PointToClient(Cursor.Position);
3 голосов
/ 19 февраля 2014

Можно использовать следующие методы для получения относительного от абсолютного и абсолютного от относительных координат:

Point Control.PointToClient(Point point);

Point Control.PointToScreen(Point point);
1 голос
/ 03 августа 2016

Cursor.Position возвращает точку на экране, но Control.PointToClient (Cursor.Position) возвращает точку на элементе управления (например, control -> панель). В вашем случае у вас есть e.Locate, который возвращает точку управления.

1 голос
/ 31 октября 2015

Я использую 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;
        }
1 голос
/ 20 ноября 2011

Просто вычтите из позиции курсора левую и верхнюю координаты элемента управления:

this.Text = Convert.ToString(
    Cursor.Position.X - this.Left + ":" +
    Cursor.Position.Y - this.Top);
0 голосов
/ 30 декабря 2012
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" - это мое полотно

...