Получение положения мыши в C # поверх PictureBox

#c# #forms

#c# #формы

Вопрос:

вопрос, кратко изложенный в названии, уже звучит плохо. В любом случае, я пытался получить координаты мыши в приложении C # form, и это очень просто сделать, используя встроенную функцию OnMouseMove. Проблема в том, что когда в приложении формы есть поле с картинками, функция не может получить координаты, потому что окно с картинками не выбирается! Я имею в виду, что курсор не указывает на части, которые блокируются окном picturebox!

Я пытался также использовать

 private void drawbox_MouseUp(object sender, MouseEventArgs e)
{
    x2 = e.X;
    y2 = e.Y;
    label6.Location = new Point(x2, y2);
    base.OnMouseMove(e);
}
  

но безуспешно.

Я искал проблему, но не смог найти исправления. Пожалуйста, помогите.

Для вашей информации, я использую следующую функцию для получения координат мыши:

 protected override void OnMouseMove( MouseEventArgs e)
{
    x2 =e.X;
    y2 = e.Y;
    label6.Location = new Point(x2, y2);
    base.OnMouseMove(e);
    //base.OnMouseMove(e);
}
  

Комментарии:

1. вы хотите, чтобы точка мыши находилась внутри picturebox (относительно picturebox), или когда мышь проходит над picturebox, захватывалась точка относительно формы?

2. Привет, спасибо за быстрый ответ, drawbox — это экземпляр picturebox, и, честно говоря, мне понадобится положение в обоих случаях, как для picturebox, так и для form. Что я хочу сделать позже, так это нарисовать некоторые объекты, а затем сохранить изображение.

Ответ №1:

Я думаю, это поможет вам. Я размещаю информацию об этом.Текст просто для демонстрации:

         private void drawbox_MouseMove(object sender, MouseEventArgs e)
        {

            Point p = e.Location;
            Point formpoint = PointToClient(MousePosition);

            this.Text = formpoint.ToString()   " - "   p.ToString();
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            this.Text = e.Location.ToString();
        }
  

Ответ №2:

@christophos Вот весь мой код, он не такой длинный. Я написал это для тестирования и, к сожалению, по-прежнему «label6» не перемещается по моему picturebox «drawbox». Это то, что я изначально сделал, это отлично работает, если нет picturebox.

 public partial class Form1 : Form
{
    Graphics drawingarea;
    int x1, y1,x2,y2 = 0;

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool GetCursorPos(ref Point lpPoint);


    public Form1()
    {
        InitializeComponent();
        drawingarea = drawbox.CreateGraphics();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Pen blackpen = new Pen(Color.Black);
        x1 = Convert.ToInt32(textBox1.Text);
        y1 = Convert.ToInt32(textBox2.Text);
        //x2 = Convert.ToInt32(textBox3.Text);
        //y2 = Convert.ToInt32(textBox4.Text);
        drawingarea.DrawLine(blackpen, x1, y1, x2, y2);
    }

    protected override void OnMouseMove( MouseEventArgs e)
    {
        Point p = GetCursorPosition();
        x2 = p.X;
        y2 = p.Y;
        label6.Location = new Point(x2, y2);
        base.OnMouseMove(e);
    }
    public static Point GetCursorPosition()
    {
        Point p = new System.Drawing.Point(0, 0);
        GetCursorPos(ref p);
        return p;
        }
}
  

Ответ №3:

Я предлагаю вам использовать для этого вызов API — некоторое время назад я реализовал следующий код в классе многократного использования, и он отлично сработал.

     [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GetCursorPos(ref System.Drawing.Point lpPoint);

    public static System.Drawing.Point GetCursorPosition()
    {
        System.Drawing.Point p = new System.Drawing.Point(0, 0);
        GetCursorPos(ref p);
        return p;
    }
  

Назовите это следующим образом:

     Point p = GetCursorPos();
  

Это должно задать положение относительно формы. Если вам нужна позиция picturebox, добавьте верхнюю и левую координаты поля к координатам X и Y в p (соответственно).

РЕДАКТИРОВАТЬ: вызов был неправильным.

РЕДАКТИРОВАТЬ 2: Из-за проблемы невозможности зафиксировать положение мыши над PictureBox, просто отправьте событие MouseMove PictureBox в форму.

Выберите поле с картинками в конструкторе, затем откройте события (молния). Щелкните один раз на пустом поле рядом с MouseMove, затем либо:

  1. Дважды щелкните, чтобы создать метод-обработчик, и вызовите свой метод OnMouseMove оттуда

    или

  2. Измените свой метод OnMouseMove, чтобы у него была эта подпись:

      private void OnMouseMove(object sender, MouseEventArgs e)
      

Комментарии:

1. Я не хочу критиковать, но чего я не понимаю, так это того, что GetCursorPosition() не вызывается. Спасибо!

2. Вам нужно будет вызвать это в вашем OnMouseMove, затем использовать.x и . это похоже на то, что вы делаете с MouseEventArgs.

3. Это весь мой код формы, я создал его для проведения некоторых тестов.

4. Удалите базу. Включите mousemove(e); в вашем коде и измените строки x1 = Convert и y1 = Convert в int. Попробуйте проанализировать(TextBox1.Text, вывод x1); int. Попробуйте проанализировать (TextBox2.Text, вывод y1);