Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/20: Рейтинг темы: голосов - 20, средняя оценка - 4.80
Sumen
241 / 243 / 27
Регистрация: 30.01.2014
Сообщений: 1,145
Записей в блоге: 2
1

Рисование кругов

23.07.2016, 17:33. Просмотров 3783. Ответов 7
Метки нет (Все метки)

Задача:
нарисовать несколько кругов (закрашенных окружностей) с центрами в заданных точках, красного цвета, полупрозрачных, диаметр взять из combobox.
Что сделал:
объявил класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Krug
        {
            int Daln;
            int x;
            int y;
            public void DrawKrug(object sender, PaintEventArgs e)
            {
                {
                    Graphics g = e.Graphics;
                    Pen pen = new Pen(Color.Red);
                    g.DrawEllipse(pen, x, y, D, D);
                }
            }
                   }
Вставил бокс с передаваемым значением D:
C#
1
2
3
4
5
private void Diam1SelectedIndexChanged(object sender, EventArgs e)
        {
            int D = Convert.ToInt32(Diam1.Text);
         
    }
соответственно, комбобоксов будет по числу кругов.
По моему пониманию ("позавчера впервые открыл книгу по C#") для того, чтобы нарисовать круг, мне понадобится после кода обработчика "Diam1SelectedIndexChanged" каким-то образом вставить код, создающий объект класса Krug с полями, присущими этому объекту - часть унаследована от класса, а часть (диаметр) - получена из комбобокса.
Куда и что вписать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2016, 17:33
Ответы с готовыми решениями:

Рисование нескольких кругов в панели
нужно написать программу : при клике по панели рисуется новый круг. Как это реализовать?

Рисование кругов по нажатию кнопки мыши
Знаю чтобы нарисованное сохранялось нужно перерисовывать все элементы. Есть такой код. Не понимаю...

Рисование Рисование точек по координатам
Доброе время суток. Помогите мне наглядным примером. У меня есть массив координат a х у 1 2 3...

Имитация кругов на воде
Доброго времени суток! Есть задача. Разработать программу, имитирующую круги на воде: в...

Оптимальное размещение кругов
Здравствуйте, не могу разобраться с реализацией оптимального размещения кругов на поверхности,...

7
Даценд
Модератор
Эксперт .NET
4401 / 4083 / 2696
Регистрация: 20.04.2015
Сообщений: 7,409
23.07.2016, 17:57 2
Sumen,
Рисовать в классе круга не нужно.
Я дам пример. Думаю, разберетесь.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
 
    List<Krug> list = new List<Krug>(); //список кругов
 
    private void Form1_Paint(object sender, PaintEventArgs e) //рисовать лучше здесь
    {
        Pen pen = new Pen(Color.Red);
        foreach (Krug krug in list)
        {
            e.Graphics.DrawEllipse(pen, krug.X, krug.Y, krug.Diam, krug.Diam);
        }
    }
 
    private void btnAdd_Click(object sender, EventArgs e) //кнопка Добавить
    {
        int x = int.Parse(tbX.Text); //текстбокс Х
        int y = int.Parse(tbY.Text); //текстбокс Y
        int d = int.Parse(cbDiam.SelectedItem.ToString()); //комбобокс с диаметром
        list.Add(new Krug(d, x, y)); //добавляем круг в список
        this.Invalidate(); //перерисовываем форму
    }
 
}
 
class Krug
{
    public int Diam { set; get; }
    public int X { set; get; }
    public int Y { set; get; }
    public Krug(int d, int x, int y)
    {
        this.Diam = d;
        this.X = x;
        this.Y = y;
    }
}
0
Sumen
241 / 243 / 27
Регистрация: 30.01.2014
Сообщений: 1,145
Записей в блоге: 2
25.07.2016, 14:19  [ТС] 3
Даценд, Спасибо, буду разбираться.
0
Sumen
241 / 243 / 27
Регистрация: 30.01.2014
Сообщений: 1,145
Записей в блоге: 2
28.07.2016, 17:35  [ТС] 4
Что-то не получилось.
Решил немного видоизменить: координаты x,y - статические, а отрисовку запустить от обработчика события комбобокса:
C#
1
2
3
4
5
6
7
8
9
 
private void DiamSelectedIndexChanged(object sender, EventArgs e) //выбор диаметра в комбобоксе
    {
        int x = 100;
        int y = 100;
        int d = int.Parse(Diam.SelectedItem.ToString()); //комбобокс с диаметром
        list.Add(new Krug(d, x, y)); //добавляем круг в список
        this.Invalidate(); //перерисовываем форму
    }
все остальное - без изменений. Форма прорисовывается, комбобокс тупо переключается. Круг не рисуется.
0
Даценд
Модератор
Эксперт .NET
4401 / 4083 / 2696
Регистрация: 20.04.2015
Сообщений: 7,409
28.07.2016, 18:33 5
Цитата Сообщение от Sumen Посмотреть сообщение
Круг не рисуется.
Вижу 2 возможных ошибки:
1) не подключен к событию обработчик DiamSelectedIndexChanged
2) не подключен к событию обработчик Form1_Paint
Потому что вот полностью код:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public partial class Form1 : Form
{
 
    public Form1()
    {
        InitializeComponent();
    }
 
    List<Krug> list = new List<Krug>(); //список кругов
 
    private void Form1_Load(object sender, EventArgs e)
    {
        Diam.SelectedIndexChanged += DiamSelectedIndexChanged;
        this.Paint += new PaintEventHandler(Form1_Paint);
    }
 
    private void Form1_Paint(object sender, PaintEventArgs e) //рисовать лучше здесь
    {
        Pen pen = new Pen(Color.Red);
        foreach (Krug krug in list)
        {
            e.Graphics.DrawEllipse(pen, krug.X, krug.Y, krug.Diam, krug.Diam);
        }
    }
 
    private void DiamSelectedIndexChanged(object sender, EventArgs e) //выбор диаметра в комбобоксе
    {
        int x = 100;
        int y = 100;
        int d = int.Parse(Diam.SelectedItem.ToString()); //комбобокс с диаметром
        list.Add(new Krug(d, x, y)); //добавляем круг в список
        this.Invalidate(); //перерисовываем форму
    }
 
 
}
class Krug
{
    public int Diam { set; get; }
    public int X { set; get; }
    public int Y { set; get; }
    public Krug(int d, int x, int y)
    {
        this.Diam = d;
        this.X = x;
        this.Y = y;
    }
}

Вот результат (круги диаметрами 20, 50, 70, 100, 150):
0
Миниатюры
Рисование кругов  
Sumen
241 / 243 / 27
Регистрация: 30.01.2014
Сообщений: 1,145
Записей в блоге: 2
28.07.2016, 18:34  [ТС] 6
Создал вообще новый проект - только поля, комбобокс и кнопка, скопипастил туда код - не рисует((
Код - не тот, который "полностью" из спойлера.
0
Даценд
Модератор
Эксперт .NET
4401 / 4083 / 2696
Регистрация: 20.04.2015
Сообщений: 7,409
28.07.2016, 18:50 7
Цитата Сообщение от Sumen Посмотреть сообщение
скопипастил туда код - не рисует((
Мало скопипастить. Нужно обработчики подписать.
Код под спойлером с динамическим подключением обработчиков. Хотя нет, там нужно Form_Load подписывать.
Код из текущего сообщения можно просто копипастить. На форме нужен только комбобокс с именем Diam:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public partial class Form1 : Form
{
 
    public Form1()
    {
        InitializeComponent();
        Diam.SelectedIndexChanged += DiamSelectedIndexChanged;
        this.Paint += new PaintEventHandler(Form1_Paint);
    }
 
    List<Krug> list = new List<Krug>(); //список кругов
 
    private void Form1_Paint(object sender, PaintEventArgs e) //рисовать лучше здесь
    {
        Pen pen = new Pen(Color.Red);
        foreach (Krug krug in list)
        {
            e.Graphics.DrawEllipse(pen, krug.X, krug.Y, krug.Diam, krug.Diam);
        }
    }
 
    private void DiamSelectedIndexChanged(object sender, EventArgs e) //выбор диаметра в комбобоксе
    {
        int x = 100;
        int y = 100;
        int d = int.Parse(Diam.SelectedItem.ToString()); //комбобокс с диаметром
        list.Add(new Krug(d, x, y)); //добавляем круг в список
        this.Invalidate(); //перерисовываем форму
    }
 
 
}
class Krug
{
    public int Diam { set; get; }
    public int X { set; get; }
    public int Y { set; get; }
    public Krug(int d, int x, int y)
    {
        this.Diam = d;
        this.X = x;
        this.Y = y;
    }
}
0
Sumen
241 / 243 / 27
Регистрация: 30.01.2014
Сообщений: 1,145
Записей в блоге: 2
28.07.2016, 19:02  [ТС] 8
Хоть убейте - не понимаю.
Создал новый проект, там combobox с именем Diam и набором чисел. Копипаст всего кода, вставляю его после
C#
1
2
namespace WindowsFormsApplication1
{
запускаю. Результат: только комбобокс.
Гоню. Рисует.

Добавлено через 5 минут
Осталось только это переварить.
Вопросы дальше:
- окружность рисуем, хочется полупрозрачный круг;
- как сделать, чтобы после выбора другого значения рисовался круг вместо этого (ну вроде как уничтожался предыдущий)? Нарисовать такой же цветом фона - "не комильфо".
0
28.07.2016, 19:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2016, 19:02

Запись координат рисуемых кругов
Здравствуйте. Есть Windows Form, в которой - PictureBox. В нем рисуются круги при нажатии мышью....

Абсолютно упругое столкновение кругов
Как реализовать абсолютно упругое столкновение кругов. Например есть поле они по нему летают...

Вращение трех кругов по часовой стрелке
Есть три круга в Windows Forms, нужно организовать их вращение по часовой стрелке по таймеру....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru