Потяните прямоугольник по щелчку мышью

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

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);
}
10
задан Uwe Keim 28 May 2016 в 10:36
поделиться

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

Edit 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();
    }
}
13
ответ дан 3 December 2019 в 21:20
поделиться

Вместо этого попробуйте этот код с 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
ответ дан 3 December 2019 в 21:20
поделиться

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

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

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

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

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

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

1
ответ дан 3 December 2019 в 21:20
поделиться

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

0
ответ дан 3 December 2019 в 21:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: