Задать вопрос
@Nem0_o

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

Windows Forms. В общем, допустим, что есть Button1 - добавить круг, PictureBoх, в котором этот круг рисуется и событие MouseClick, по которому должен нарисоваться круг в PictureBox'e.

Как сделать так, чтобы после нажатия кнопки (Добавить круг) можно было щелкнуть мышкой в поле PictureBox'a и там бы нарисовался круг?
  • Вопрос задан
  • 10310 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Фигуры фиксированного размера можно нарисовать так:
public partial class Form1 : Form
{

    private int BrushType = 1;

    public Form1()
    {
      InitializeComponent();

      // создаем PictureBox
      var pic = new PictureBox { Dock = DockStyle.Fill, BackColor = Color.White };
      pic.MouseClick += PictureBox_MouseClick;
      this.Controls.Add(pic);

      // создаем панель для кнопок
      var panel = new FlowLayoutPanel { Dock = DockStyle.Top, AutoSize = true };
      this.Controls.Add(panel);

      // кнопки
      var btn = new RadioButton 
      { 
        Text = "Круг", 
        Tag = 1, 
        Appearance = Appearance.Button, 
        Checked = true, 
        AutoSize = true 
      };
      btn.Click += Button_Click;
      panel.Controls.Add(btn);

      btn = new RadioButton
      {
        Text = "Не круг",
        Tag = 2,
        Appearance = Appearance.Button,
        AutoSize = true
      };
      btn.Click += Button_Click;
      panel.Controls.Add(btn);

      btn = new RadioButton
      {
        Text = "Квадратный круг",
        Tag = 3,
        Appearance = Appearance.Button,
        AutoSize = true
      };
      btn.Click += Button_Click;
      panel.Controls.Add(btn);
    }

    private void Button_Click(object sender, EventArgs e)
    {
      var btn = (RadioButton)sender;
      this.BrushType = (int)btn.Tag;
    }

    private void PictureBox_MouseClick(object sender, MouseEventArgs e)
    {
      // получаем ссылку на PictureBox
      var pic = (PictureBox)sender;
      // получаем Graphics из PictureBox
      var g = pic.CreateGraphics();

      if (this.BrushType == 2)
      {
        // рисуем не круглый квадрат
        g.DrawRectangle(Pens.Black, e.X, e.Y, 50, 50);
      }
      else if (this.BrushType == 3)
      {
        // рисуем квадратный круг
        Point[] points = new Point[6];
        int half = 50 / 2;
        int quart = 50 / 4;
        points[0] = new Point(e.X + quart, e.Y);
        points[1] = new Point(e.X + 50 - quart, e.Y);
        points[2] = new Point(e.X + 50, e.Y + half);
        points[3] = new Point(e.X + 50 - quart, e.Y + 50);
        points[4] = new Point(e.X + quart, e.Y + 50);
        points[5] = new Point(e.X, e.Y + half);
        g.DrawPolygon(Pens.Black, points);
      }
      else
      {
        // рисуем эллипс
        g.DrawEllipse(Pens.Black, e.X, e.Y, 50, 50);
      }
    }

}

В качестве кнопок используются RadioButton, т.к. это удобней.
Чтобы не стиралось, можно сделать Bitmap:
var pic = (PictureBox)sender;
if (pic.Image == null) { pic.Image = new Bitmap(pic.Width, pic.Height); }
var bmp = new Bitmap(pic.Image);
var g = Graphics.FromImage(bmp);

И после завершения рисования, передать картинку в PictureBox:
pic.Image = bmp;

Результат:
c141d6f9ebe44712a5d9c5f9aa67dcb1.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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