Получить позицию курсора относительно элемента управления - C #

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

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

Но это дает позицию по отношению к экрану, а не элементу управления.

Будем признательны за образец кода.


person Farid-ur-Rahman    schedule 20.11.2011    source источник


Ответы (10)


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

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    Text = e.Location.X + ":" + e.Location.Y;      
} 
person Ani    schedule 20.11.2011

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

person BrendanMcK    schedule 20.11.2011

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

var coordinates = yourControl.PointToClient(Cursor.Position);
person Justas    schedule 13.10.2014

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

Point Control.PointToClient(Point point);

Point Control.PointToScreen(Point point);
person Chris    schedule 19.02.2014

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

person ndukan    schedule 03.08.2016

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

this.Text = Convert.ToString(
    Cursor.Position.X - this.Left + ":" +
    Cursor.Position.Y - this.Top);
person BlackBear    schedule 20.11.2011
comment
Может работать для форм верхнего уровня, но не будет работать для элементов управления внутри одного: Control.Left - это позиция элемента управления относительно его родительской клиентской области, а не экрана. - person BrendanMcK; 20.11.2011

Я использую 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;
        }
person Huỳnh Hữu Ân    schedule 31.10.2015

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" - моя холстовая панель.

person Pichitron    schedule 30.12.2012

Код фрагмента, как показано ниже:

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
    }
}

Где кнопка - одна из многих кнопок на панели хостинга.

person Tomex Ou    schedule 23.08.2020

Создайте стандартный проект C # WinForms

Поместите 2 текстовых поля с именами X и Y и объект Timer из панели инструментов на страницу дизайна.

Нажмите [F7] и замените весь код приведенным ниже.

using System;
using System.Windows.Forms;

namespace MousePos
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            timer1.Start();
        }

        private void Form1_MouseCaptureChanged(object sender, EventArgs e)
        {
            X.Text = MousePosition.X.ToString();
            Y.Text = MousePosition.Y.ToString();
        }
    }
}

Установите действие Timer.Tick на Form1_MouseCaptureChanged

[F5] Запускаем - и теперь у вас есть приложение MosusePos.

person JanBorup    schedule 08.09.2020