Как я могу захватить координату мыши в PictureBox?

#c# #.net #winforms #picturebox

#c# #.net #winforms #picturebox

Вопрос:

Я новичок в c #. У меня есть изображение в picturebox, я хотел бы нарисовать прямоугольник на изображении, чтобы зафиксировать координаты X, Y и ширину / высоту прямоугольника, который я буду рисовать (на фоне изображения в picturebox). я знаю, что должен что-то сделать в pictureBox1_MouseEnter .. и т.д. Но я не знаю, с чего начать.

     private void pictureBox1_MouseEnter(object sender, EventArgs e)
    {

        Rectangle Rect = RectangleToScreen(this.ClientRectangle);
    }
  

Я был бы признателен, если кто-нибудь может дать мне пример кода.

Спасибо.

Ответ №1:

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

Итак, в MouseDown методе обработчика событий сохраните текущие координаты курсора. Это начальное положение прямоугольника, точки (X, Y).

 private Point initialMousePos;

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    this.initialMousePos = e.Location;
}
  

И затем, в MouseUp событии, которое возникает, когда пользователь прекращает перетаскивание и отпускает кнопку мыши, вы хотите сохранить конечную точку курсора мыши и объединить ее с начальной отправной точкой для построения прямоугольника. Самый простой способ построить такой прямоугольник — использовать FromLTRB статический метод Rectangle класса:

 private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    // Save the final position of the mouse
    Point finalMousePos = e.Location;

    // Create the rectangle from the two points
    Rectangle drawnRect = Rectangle.FromLTRB(
                                             this.initialMousePos.X,
                                             this.initialMousePos.Y,
                                             finalMousePos.X,
                                             finalMousePos.Y);

    // Do whatever you want with the rectangle here
    // ...
}
  

Вероятно, вы захотите объединить это с некоторым кодом рисования в MouseMove методе обработчика событий, чтобы предоставить пользователю визуальную индикацию прямоугольника, который они рисуют, пока они его рисуют.

Правильный способ сделать это — обработать MouseMove событие, чтобы получить текущее положение мыши, а затем вызвать Invalidate метод, который вызовет Paint событие. Весь ваш код рисования должен быть в Paint обработчике событий. Это лучший подход, чем тот, который используется во многих примерах, которые вы найдете в Интернете, где вы увидите что-то вроде CreateGraphics вызываемого внутри MouseMove метода обработчика событий. Избегайте этого, если возможно.

Пример реализации:

 private Point currentMousePos;

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    // Save the current position of the mouse
    currentMousePos = e.Location;

    // Force the picture box to be repainted
    pictureBox1.Invalidate();
}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    // Create a pen object that we'll use to draw
    // (change these parameters to make it any color and size you want)
    using (Pen p = new Pen(Color.Blue, 3.0F))
    {
        // Create a rectangle with the initial cursor location as the upper-left
        // point, and the current cursor location as the bottom-right point
        Rectangle currentRect = Rectangle.FromLTRB(
                                                   this.initialMousePos.X,
                                                   this.initialMousePos.Y,
                                                   currentMousePos.X,
                                                   currentMousePos.Y);

        // Draw the rectangle
        e.Graphics.DrawRectangle(p, currentRect);
    }
}
  

Пара моментов, на которые следует обратить внимание в этом коде, если вы никогда раньше не рисовали никаких типов. Во-первых, я заключил создание Pen объекта (который мы используем для выполнения фактического рисования) в using инструкцию. Это хорошая общая практика всякий раз, когда вы создаете объект, который реализует IDisposable интерфейс, такой как кисти и перья, чтобы предотвратить утечку памяти в вашем приложении.

Кроме того, PaintEventArgs предоставляет нам экземпляр Graphics класса, который инкапсулирует все базовые функции рисования в приложении .NET. Все, что вам нужно сделать, это вызвать такие методы, как DrawRectangle или DrawImage , в этом экземпляре класса, передав соответствующие объекты в качестве параметров, и весь рисунок будет выполнен за вас автоматически. Достаточно просто, не так ли?

И, наконец, обратите внимание, что мы сделали здесь точно то же самое для создания прямоугольника, что мы в конечном итоге делаем в MouseUp методе обработчика событий. Это имеет смысл, потому что нам просто нужен мгновенный размер прямоугольника, пока пользователь его создает.

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

1. спасибо, Коди, ваш код работает нормально, не могли бы вы дать мне краткий образец для рисования?

2. @Kelly: Обновлено образцом рисования. Не уверен, насколько вы знакомы с такого рода вещами в . СЕТЕВОЙ мир, поэтому я попытался объяснить это как можно лучше. Пожалуйста, оставьте комментарий, если у вас есть еще вопросы!