C # Рисование прямоугольника при событии мыши

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

Как на картинке. Это для приложения C # .net Forms.

Помогите мне добиться этого. Любая помощь приветствуется.

Спасибо, Йохан


person yohan.jayarathna    schedule 01.03.2011    source источник
comment
Это прямоугольник выделения с резинкой? Или вы хотите, чтобы они нарисовали на форме постоянный контур?   -  person Cody Gray    schedule 01.03.2011
comment
Да, это выбор резинкой, а не постоянный   -  person yohan.jayarathna    schedule 01.03.2011


Ответы (3)


Вы можете сделать это в три этапа:

  • Сначала проверьте, нажата ли мышь
  • Если это происходит при перемещении мыши, продолжайте инициализировать прямоугольник с новыми позициями, пока мышь перетаскивается.
  • Затем в событии рисования нарисуйте прямоугольник. (Он будет подниматься почти для каждого события мыши, зависит от частоты обновления мыши и dpi)

Вы можете сделать что-то вроде этого (в своем Form):

public class Form1
{

       Rectangle mRect;

    public Form1()
    {
                    InitializeComponents();

                    //Improves prformance and reduces flickering
        this.DoubleBuffered = true;
    }

            //Initiate rectangle with mouse down event
    protected override void OnMouseDown(MouseEventArgs e)
    {
        mRect = new Rectangle(e.X, e.Y, 0, 0);
        this.Invalidate();
    }

            //check if mouse is down and being draged, then draw rectangle
    protected override void OnMouseMove(MouseEventArgs e)
    {
        if( e.Button == MouseButtons.Left)
        {
            mRect = new Rectangle(mRect.Left, mRect.Top, e.X - mRect.Left, e.Y - mRect.Top);
            this.Invalidate();
        }
    }

            //draw the rectangle on paint event
    protected override void OnPaint(PaintEventArgs e)
    {
                //Draw a rectangle with 2pixel wide line
        using(Pen pen = new Pen(Color.Red, 2))
        {
        e.Graphics.DrawRectangle(pen, mRect);
        }

    }
}

позже, если вы захотите проверить, находятся ли кнопки (показанные на схеме) в прямоугольнике или нет, вы можете сделать это, проверив область кнопки и проверив, лежат ли они в нарисованном прямоугольнике.

person Shekhar_Pro    schedule 01.03.2011
comment
привет, это работает отлично, я сделал то же самое с событиями элемента управления pictureBox, но это не сработало. Я сделал что-то не так? - person yohan.jayarathna; 01.03.2011
comment
он работал, но, вероятно, он был нарисован под окном с картинками (на форме) ... покажите мне код, который вы пробовали ... также проверьте ответ @hans Passant ... его трюк будет работать везде. - person Shekhar_Pro; 01.03.2011
comment
Хорошо, теперь он работает, в моем случае this.Invalidate (); должно быть pictureBox1.Invalidate (); Большое спасибо :) - person yohan.jayarathna; 01.03.2011

Решение от Shekhar_Pro рисует прямоугольник только в одном направлении (сверху вниз, слева направо), если вы хотите рисовать прямоугольник независимо от положения мыши и направления движения, решение:

Point selPoint;
Rectangle mRect;
void OnMouseDown(object sender, MouseEventArgs e)
{
     selPoint = e.Location; 
    // add it to AutoScrollPosition if your control is scrollable
}
void OnMouseMove(object sender, MouseEventArgs e)
{
     if (e.Button == MouseButtons.Left)
     {
        Point p = e.Location;
        int x = Math.Min(selPoint.X, p.X)
        int y = Math.Min(selPoint.Y, p.Y)
        int w = Math.Abs(p.X - selPoint.X);
        int h = Math.Abs(p.Y - selPoint.Y);
        mRect = new Rectangle(x, y, w, h);   
        this.Invalidate(); 
     }
}
void OnPaint(object sender, PaintEventArgs e)
{
     e.Graphics.DrawRectangle(Pens.Blue, mRect);
}
person Ahmad    schedule 02.01.2015

Эти синие прямоугольники очень похожи на элементы управления. В Winforms сложно нарисовать линию поверх элемента управления. Вы должны создать прозрачное окно, которое перекрывает поверхность конструктора, и нарисовать прямоугольник в этом окне. Так же работает и дизайнер Winforms. Пример кода находится здесь .

person Hans Passant    schedule 01.03.2011
comment
+1 хороший трюк ... если вы помните, мой собственный ответ был взят из одного из ваших ответов на MSDN, хотя в этой ситуации он не сработает. - person Shekhar_Pro; 01.03.2011