Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Элемент формы Panel / 25 сообщений из 25, страница 1 из 1
31.07.2019, 17:11
    #39843605
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
Здравствуйте!

Есть такой код на С#
Код: 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.
namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Panel panel1 = new panel1();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Graphics gr = e.Graphics;
            Pen p = new Pen(Color.Blue, 2);
            Point p1 = new Point(5, 10);
            Point p2 = new Point(70, 100);
            gr.DrawLine(p, p1, p2);
            gr.Dispose();
        }

    }
}

Выдает такой результат
...
Рейтинг: 0 / 0
31.07.2019, 17:12
    #39843606
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
Как из метода button1_Click обратиться к элементу формы panel1 для рисования?
...
Рейтинг: 0 / 0
31.07.2019, 17:20
    #39843613
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
ferzmikk,

"- Разрешите обратиться".
По факту, вам нужно вызвать у панели перерисовку методом по типу Invalidate().
Метод Invalidate сделает необходимым при следующем цикле обработки перерисовку её панели и будет вызвано связанно с этим событие, которые вы переопределили.
...
Рейтинг: 0 / 0
31.07.2019, 17:29
    #39843618
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
ferzmikkКак из метода button1_Click обратиться к элементу формы panel1 для рисования?
Можно так:
Код: c#
1.
2.
3.
4.
        private void button1_Click(object sender, EventArgs e)
        {
            var gr = panel1.CreateGraphics();
        }


Но лучше так как сказал Roman Mejtes, т.к. элемент Panel очень часто вызывает событие Paint - изменили размер формы, переместили окно с панелью туда-сюда, переключили окна. Так работает Windows.
...
Рейтинг: 0 / 0
31.07.2019, 18:35
    #39843666
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
Roman MejtesПо факту, вам нужно вызвать у панели перерисовку методом по типу Invalidate().
Метод Invalidate сделает необходимым при следующем цикле обработки перерисовку её панели и будет вызвано связанно с этим событие, которые вы переопределили.Я правильно понимаю, что если на панеле круг и квадрат, то при перерисовки будет перерисовывать круг и квадрат, но с другими параметрами (цвет, толщина, координаты)?
...
Рейтинг: 0 / 0
31.07.2019, 18:53
    #39843672
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
ferzmikkRoman MejtesПо факту, вам нужно вызвать у панели перерисовку методом по типу Invalidate().
Метод Invalidate сделает необходимым при следующем цикле обработки перерисовку её панели и будет вызвано связанно с этим событие, которые вы переопределили.Я правильно понимаю, что если на панеле круг и квадрат, то при перерисовки будет перерисовывать круг и квадрат, но с другими параметрами (цвет, толщина, координаты)?вроде всё само в WF не работает, юзайте WPF, там есть и трансформации и масштабирование и с геометрией работать на много проще. На WF забил давно, не помню точного ответа на ваш вопрос. В WF есть еще проблемы с перерисовкой во время перемещения формы за границы экрана, буферизации двойные и так далее. С графикой работать не удобно. в WPF можно создать геометрию и отобразить её и больше ничего делать то и не надо, всё само работает как надо и hittest работает идеально. опишите точнее суть идеи, зачем вам рисовать в панели и я подскажу вам пример, как это сделать проще в WPF
...
Рейтинг: 0 / 0
31.07.2019, 19:12
    #39843680
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
Roman Mejtesопишите точнее суть идеи, зачем вам рисовать в панели и я подскажу вам пример, как это сделать проще в WPFИзучаю C# и экспериментирую с геометрической графикой на координатной оси. На панели надо отобразить некий набор отрезков и геометрическую фигуру (например, прямоугольник). После нажатия кнопки - отрезки (целиком и/или частично), которые входят в геометрическую фигуру, высвечиваются линиями по жирнее.
...
Рейтинг: 0 / 0
31.07.2019, 21:09
    #39843714
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
Получился такой код C#
Код: 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.
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        Graphics gr;

        public Form1()
        {
            InitializeComponent();

            gr = panel1.CreateGraphics(); 
        }

        private void button1_Click(object sender, EventArgs e)
        {
            panel1.Refresh();

            Color color = Color.Black;
            Pen p = new Pen(Color.Blue, 2);
            Point p1 = new Point(5, 10);
            Point p2 = new Point(70, 100);
            gr.DrawLine(p, p1, p2);
            gr.Dispose();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
           
        } 
    }
}

1. Как оцениваете такой вариант?

2. Если второй раз нажать на кнопку, то появляется ошибка на строке
Код: c#
1.
gr.DrawLine(p, p1, p2);

"System.ArgumentException: "Недопустимый параметр."". В окне контрольного значения при нажатии на кнопку первый и второй раз - значения одинаковые. Почему так? На что нужно обратить внимание?
...
Рейтинг: 0 / 0
31.07.2019, 22:09
    #39843723
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
ferzmikk
Получился такой код C#
Код: 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.
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        Graphics gr;

        public Form1()
        {
            InitializeComponent();

            gr = panel1.CreateGraphics(); 
        }

        private void button1_Click(object sender, EventArgs e)
        {
            panel1.Refresh();

            Color color = Color.Black;
            Pen p = new Pen(Color.Blue, 2);
            Point p1 = new Point(5, 10);
            Point p2 = new Point(70, 100);
            gr.DrawLine(p, p1, p2);
            gr.Dispose();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
           
        } 
    }
}

1. Как оцениваете такой вариант?

2. Если второй раз нажать на кнопку, то появляется ошибка на строке
Код: c#
1.
gr.DrawLine(p, p1, p2);

"System.ArgumentException: "Недопустимый параметр."". В окне контрольного значения при нажатии на кнопку первый и второй раз - значения одинаковые. Почему так? На что нужно обратить внимание?возможно толщина линии 0вая или какие то другие параметры карандаша
...
Рейтинг: 0 / 0
31.07.2019, 22:41
    #39843729
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
Если в коде закомментировать запись
Код: javascript
1.
gr.Dispose();

то после второго нажатия не появляется ошибка.

Почему так? Можно пропускать эту запись? По логике эта запись освобождает все ресурсы, связанные с отрисовкой.
...
Рейтинг: 0 / 0
31.07.2019, 23:14
    #39843746
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
Начало координат слева вверху. Как возможно сделать так, чтобы начало координат было слева снизу?
...
Рейтинг: 0 / 0
01.08.2019, 07:09
    #39843787
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
ferzmikk,

Код: c#
1.
2.
3.
4.
private void button1_Click(object sender, EventArgs e)
        {
            panel1.Refresh();
        }
...
Рейтинг: 0 / 0
01.08.2019, 08:46
    #39843818
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
Cat2
Код: c#
1.
2.
3.
4.
private void button1_Click(object sender, EventArgs e)
        {
            panel1.Refresh();
        }

Вы предлагаете в теле метода button1_Click оставить только строку panel1.Refresh();?
...
Рейтинг: 0 / 0
01.08.2019, 11:44
    #39843971
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
ferzmikk
Получился такой код C#
Код: 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.
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        Graphics gr;

        public Form1()
        {
            InitializeComponent();

            gr = panel1.CreateGraphics(); 
        }

        private void button1_Click(object sender, EventArgs e)
        {
            panel1.Refresh();

            Color color = Color.Black;
            Pen p = new Pen(Color.Blue, 2);
            Point p1 = new Point(5, 10);
            Point p2 = new Point(70, 100);
            gr.DrawLine(p, p1, p2);
            gr.Dispose();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
           
        } 
    }
}

1. Как оцениваете такой вариант?

2. Если второй раз нажать на кнопку, то появляется ошибка на строке
Код: c#
1.
gr.DrawLine(p, p1, p2);

"System.ArgumentException: "Недопустимый параметр."". В окне контрольного значения при нажатии на кнопку первый и второй раз - значения одинаковые. Почему так? На что нужно обратить внимание?

Потому что создаешь Graphics один раз в конструкторе класса формы, а диспозишь его при каждом нажатии кнопки.

Microsoft Docs.... Therefore you cannot cache the Graphics object for reuse
... Instead, you must call CreateGraphics every time that you want to use the Graphics object, and then call Dispose when you are finished using it
Почитать здесь
...
Рейтинг: 0 / 0
01.08.2019, 18:20
    #39844272
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
ferzmikkCat2
Код: c#
1.
2.
3.
4.
private void button1_Click(object sender, EventArgs e)
        {
            panel1.Refresh();
        }


Вы предлагаете в теле метода button1_Click оставить только строку panel1.Refresh();?
Да.
Именно эта команда и вызывает метод Paint
...
Рейтинг: 0 / 0
01.08.2019, 18:23
    #39844273
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
Cat2Да.
Именно эта команда и вызывает метод Paint

То есть в заглавном топике все правильно правильно, кроме отсутствия вызова Refresh.
Код: 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.
namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            panel1.Refrech();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Graphics gr = e.Graphics;
            Pen p = new Pen(Color.Blue, 2);
            Point p1 = new Point(5, 10);
            Point p2 = new Point(70, 100);
            gr.DrawLine(p, p1, p2);
            gr.Dispose();
        }

    }
}
...
Рейтинг: 0 / 0
01.08.2019, 18:33
    #39844275
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
Код: 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.
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        Random rnd;
        public Form1()
        {
            InitializeComponent();
            rnd = new Random();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            
            Graphics gr = e.Graphics;
            Pen p = new Pen(Color.Blue, 2);
            Point p1 = new Point(5, 10);
            Point p2 = new Point(70, rnd.Next(100));
            gr.DrawLine(p, p1, p2);
            gr.Dispose();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            panel1.Refresh();
        }
    }
}
...
Рейтинг: 0 / 0
02.08.2019, 14:26
    #39844639
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
Cat2,

Спасибо!


Задача сводится к тому, что отрезки строятся после нажатия кнопки, а не после открытия формы.

Переписал код. Пока не обращайте внимание на наличие проверки textbox на заполненность.
C#
Код: 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.
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        int x1, y1, x2, y2;

        public Form1()
        {
            InitializeComponent();            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            x1 = Convert.ToInt32(textBox1_x1.Text);
            y1 = Convert.ToInt32(textBox1_y1.Text);
            x2 = Convert.ToInt32(textBox1_x2.Text);
            y2 = Convert.ToInt32(textBox1_y2.Text);

            panel1.Refresh();           
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (!(x1 == 0 && y2 == 0 && x2 == 0 && y2 == 0))//На первом запуске не выводит отрезок
                {Graphics gr = e.Graphics;                
                Pen p = new Pen(Color.Blue, 2);
                Point p1 = new Point(x1, y1);
                Point p2 = new Point(x2, y2);
                gr.DrawLine(p, p1, p2);
                gr.Dispose(); }
        } 
    }
}

Возникают вопросы:

1. Какую лучше делать проверку, чтобы при открытии формы не строились отрезки? Учитывая, что не заполненное TextBox не означает значение 0.

Еще как вариант можно обойтись без такой проверки, если задать предопределенные значения.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public Form1()
        {
            InitializeComponent();

            textBox_x1.Text = Convert.ToString(10);
            textBox_y1.Text = Convert.ToString(50);
            textBox_x2.Text = Convert.ToString(700);
            textBox_y2.Text = Convert.ToString(200);

            panel1.Refresh();
        }

При открытии формы в Textbox отображаются предопределенные значения, но не строится отрезок. Если написать в методе Form1_Load , то тоже самое? Почему так? Как правильно написать?

2. Насколько правильно для координат точек переменные задавать тип Int, если используем объект Panel?

3. Правильно ли конвертирую из TextBox в Int , а именно, ToInt32 .
Код: c#
1.
x1 = Convert.ToInt32(textBox1_x1.Text);


4. Начало координат начинается слева сверху. Как сделать так, чтобы начиналось слева внизу? Через RotateTransform или добавить метод, который пересчитывает точку на ординате учитывая максимальный размер ординаты?
...
Рейтинг: 0 / 0
02.08.2019, 14:28
    #39844640
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
5. Заметил, что объект Panel имеет как крупное битовое изображение, то есть линия похожа на лестницу. Это особенность объекта Panel, который имеет не высокое разрешение? Или можно как то настроить?
...
Рейтинг: 0 / 0
02.08.2019, 15:02
    #39844658
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
так bitmap же, хотите ровненько - переходите на векторную графику
...
Рейтинг: 0 / 0
02.08.2019, 15:45
    #39844689
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
ferzmikk5. Заметил, что объект Panel имеет как крупное битовое изображение, то есть линия похожа на лестницу. Это особенность объекта Panel, который имеет не высокое разрешение? Или можно как то настроить?
Во-первых, если рисуешь в обработчике Paint, создавать Graphics не нужно. Его надо брать из e.Graphics. Диспозить в этом случае тоже не надо.
Во-вторых, сглаживание включается так:
Код: c#
1.
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

или так:
Код: c#
1.
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
...
Рейтинг: 0 / 0
02.08.2019, 15:56
    #39844691
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
Worobjoffесли рисуешь в обработчике Paint, создавать Graphics не нужно. Его надо брать из e.Graphics. Диспозить в этом случае тоже не надо.Вы предлагаете вместо такой записи
Код: c#
1.
2.
3.
4.
5.
6.
Graphics gr = e.Graphics;              
Pen p = new Pen(Color.Blue, 2);
Point p1 = new Point(x1, y1);
Point p2 = new Point(x2, y2);
gr.DrawLine(p, p1, p2);
gr.Dispose()

так делать
Код: c#
1.
2.
3.
4.
Pen p = new Pen(Color.Blue, 2);
Point p1 = new Point(x1, y1);
Point p2 = new Point(x2, y2);
e.Graphics.DrawLine(p, p1, p2);

Верно?
...
Рейтинг: 0 / 0
02.08.2019, 16:08
    #39844697
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
тут, по шагам разжёвано:
http://csharphelper.com/blog/2018/12/let-the-user-draw-lines-in-c/
...
Рейтинг: 0 / 0
02.08.2019, 17:23
    #39844753
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
У Panel есть возможность наносить/удалять слои с изображениями?
...
Рейтинг: 0 / 0
04.08.2019, 02:28
    #39845014
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Элемент формы Panel
ferzmikkУ Panel есть возможность наносить/удалять слои с изображениями?

Нет.

Можно симулировать каждый слой отдельный изображением (Bitmap) с прозрачным фоном.
И выводить несколько изображений одно поверх другого (Graphics.DrawImage).
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Элемент формы Panel / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]