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

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

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);
}

4 ответа

Решение

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

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

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 для такого простого случая - это слишком много усилий для простого рисования прямоугольника на панели. Тем не менее, рисование прямоугольника таким образом работает, но прямоугольник исчезнет, ​​когда форма будет перерисована (например, при сворачивании и последующем отображении формы снова. Если прямоугольник должен быть постоянным, вам придется использовать метод рисования, и для этого вы Придется (например) создать прямоугольник в событии click, а затем нарисовать его в событии paint. (См. решение roygbiv для такого подхода). Примечание: если вы используете метод рисования, вы должны сохранить его как эффективен настолько, насколько это возможно, так как метод рисования часто вызывается очень часто.

Редактировать 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();
    }
}

Попробуйте этот код с 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()), вы обычно сталкиваетесь с проблемой непостоянства.

Обновление: вот еще один ответ с более подробным примером рисования чего-либо в ответ на нажатие мыши:

как рисовать рисунки в картинной коробке

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

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

        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", чтобы нарисовать прямоугольник "перетаскивания".

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

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

Привязка к сетке мыши блокировка

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

Другие вопросы по тегам