Нарисуйте прямоугольник щелчком мыши

Можно ли рисовать прямоугольник с помощью мыши? Мой код пока не работает. Можете ли вы мне помочь?

private void panel1_MouseClick(object sender, MouseEventArgs e)
{
    Graphics g = this.CreateGraphics();
    Pen pen = new Pen(Color.Black, 2);

    g.DrawRectangle(pen, 100,100, 100, 200);
}

Ответ 1

Отредактированная версия:

Без особого одобрения того, что вы пытаетесь сделать:

private void panel1_Click(object sender, EventArgs e) {
    using (Graphics g = this.panel1.CreateGraphics()) {
        Pen pen = new Pen(Color.Black, 2);
        Brush brush = new SolidBrush(this.panel1.BackgroundColor);

        g.DrawRectangle(pen, 100,100, 100, 200);

        pen.Dispose();
    }
}

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

Обычно переопределение Paint для такого простого случая - это просто слишком много усилий для простого рисования прямоугольника на панели. Однако рисование прямоугольника таким образом работает, но прямоугольник исчезнет, ​​когда форма будет перерисована (например, путем минимизации и последующего отображения формы снова. Если прямоугольник должен быть постоянным, вам придется использовать метод рисования, и для этого вы (например,) создать прямоугольник в событии клика, а затем нарисовать его в событии рисования (см. решение roygbiv для такого подхода). Примечание. Если вы согласитесь с методом рисования, вы должны сохранить его таким же эффективным, как возможно, так как метод paint часто называется verry.

Изменить 2

Вам не нужно очищать фон, так как ваш прямоугольник будет рисоваться всегда в одном месте. Чтобы нарисовать прямоугольник в той точке, где был выбран пользователь (, это предположение, что это то, что вам нужно), вы должны переместить код в событие мыши вниз, например:

private void panel1_MouseDown(object sender, MouseEventArgs e) {
    using (Graphics g = this.panel1.CreateGraphics()) {
        Pen pen = new Pen(Color.Black, 2);
        Brush brush = new SolidBrush(this.panel1.BackColor);

        g.FillRectangle(brush, this.panel1.Bounds);  // redraws background
        g.DrawRectangle(pen, e.X, e.Y, 20, 20);

        pen.Dispose();
        brush.Dispose();
    }
}

Ответ 2

Попробуйте этот код с PictureBox вместо этого (только для того, чтобы вы начали - есть много разных способов сделать это):

private void pictureBox1_Click(object sender, EventArgs e)
{
    if (pictureBox1.Image == null)
    {
            pictureBox1.Image = new Bitmap(pictureBox1.width, 
                    pictureBox1.height);
    }
    using (Graphics g = Graphics.FromImage(pictureBox1.Image))
    {
        // draw black background
        g.Clear(Color.Black);
        Rectangle rect = new Rectangle(100, 100, 200, 200);
        g.DrawRectangle(Pens.Red, rect);
    }
    pictureBox1.Invalidate();
}

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

Обновить: здесь еще один ответ с более подробным примером рисования чего-либо в ответ на то, где щелкнули мышь:

как рисовать чертежи в окне изображения

Ответ 3

Можно ли рисовать прямоугольник с помощью мыши?

Если вы имеете в виду "Когда мышь нажата на моей панели, я хочу отобразить прямоугольник", вы можете сделать это следующим образом:

        private bool displayRectangle = false;

        private void panel1_MouseClick(object sender, MouseEventArgs e)
        {
            displayRectangle = true;
            panel1.Invalidate(false);
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (displayRectangle)
            {
                using (Pen p = new Pen(Color.Black, 2))
                {
                    e.Graphics.DrawRectangle(p, 100, 100, 100, 200);
                }
            }
        }

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

Вам нужно обрабатывать мыши, перемещать и опускать события, отслеживающие дельта между точкой мыши и текущей позицией. Наконец, при помощи мыши вы нарисуете свой прямоугольник. Это становится более сложным, потому что вам нужно использовать двойную буферизацию или прямоугольник "xor", чтобы нарисовать прямоугольник "drag".

Эти два потока могут помочь:

перетаскивание изображения внутри winform во время выполнения

Блокировка привязки к сетке

Ответ 4

Вы должны нарисовать его в событии "Paint" элемента управления (в этом случае панель 1).