C # Рисование прямоугольника на событие мыши - PullRequest
4 голосов
/ 01 марта 2011

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

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

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

Спасибо Йоан

Ответы [ 3 ]

5 голосов
/ 01 марта 2011

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

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

Вы можете сделать что-то вроде этого (в вашем 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);
        }

    }
}

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

3 голосов
/ 02 января 2015

Решение от 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);
}
2 голосов
/ 01 марта 2011

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

...