powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Элемент формы Panel
25 сообщений из 25, страница 1 из 1
Элемент формы Panel
    #39843605
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть такой код на С#
Код: 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
Элемент формы Panel
    #39843606
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как из метода button1_Click обратиться к элементу формы panel1 для рисования?
...
Рейтинг: 0 / 0
Элемент формы Panel
    #39843613
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

"- Разрешите обратиться".
По факту, вам нужно вызвать у панели перерисовку методом по типу Invalidate().
Метод Invalidate сделает необходимым при следующем цикле обработки перерисовку её панели и будет вызвано связанно с этим событие, которые вы переопределили.
...
Рейтинг: 0 / 0
Элемент формы Panel
    #39843618
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Элемент формы Panel
    #39843666
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesПо факту, вам нужно вызвать у панели перерисовку методом по типу Invalidate().
Метод Invalidate сделает необходимым при следующем цикле обработки перерисовку её панели и будет вызвано связанно с этим событие, которые вы переопределили.Я правильно понимаю, что если на панеле круг и квадрат, то при перерисовки будет перерисовывать круг и квадрат, но с другими параметрами (цвет, толщина, координаты)?
...
Рейтинг: 0 / 0
Элемент формы Panel
    #39843672
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkRoman MejtesПо факту, вам нужно вызвать у панели перерисовку методом по типу Invalidate().
Метод Invalidate сделает необходимым при следующем цикле обработки перерисовку её панели и будет вызвано связанно с этим событие, которые вы переопределили.Я правильно понимаю, что если на панеле круг и квадрат, то при перерисовки будет перерисовывать круг и квадрат, но с другими параметрами (цвет, толщина, координаты)?вроде всё само в WF не работает, юзайте WPF, там есть и трансформации и масштабирование и с геометрией работать на много проще. На WF забил давно, не помню точного ответа на ваш вопрос. В WF есть еще проблемы с перерисовкой во время перемещения формы за границы экрана, буферизации двойные и так далее. С графикой работать не удобно. в WPF можно создать геометрию и отобразить её и больше ничего делать то и не надо, всё само работает как надо и hittest работает идеально. опишите точнее суть идеи, зачем вам рисовать в панели и я подскажу вам пример, как это сделать проще в WPF
...
Рейтинг: 0 / 0
Элемент формы Panel
    #39843680
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesопишите точнее суть идеи, зачем вам рисовать в панели и я подскажу вам пример, как это сделать проще в WPFИзучаю C# и экспериментирую с геометрической графикой на координатной оси. На панели надо отобразить некий набор отрезков и геометрическую фигуру (например, прямоугольник). После нажатия кнопки - отрезки (целиком и/или частично), которые входят в геометрическую фигуру, высвечиваются линиями по жирнее.
...
Рейтинг: 0 / 0
Элемент формы Panel
    #39843714
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
Элемент формы Panel
    #39843723
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Элемент формы Panel
    #39843729
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в коде закомментировать запись
Код: javascript
1.
gr.Dispose();

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

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

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

Вы предлагаете в теле метода button1_Click оставить только строку panel1.Refresh();?
...
Рейтинг: 0 / 0
Элемент формы Panel
    #39843971
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Элемент формы Panel
    #39844272
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
ferzmikkCat2
Код: c#
1.
2.
3.
4.
private void button1_Click(object sender, EventArgs e)
        {
            panel1.Refresh();
        }


Вы предлагаете в теле метода button1_Click оставить только строку panel1.Refresh();?
Да.
Именно эта команда и вызывает метод Paint
...
Рейтинг: 0 / 0
Элемент формы Panel
    #39844273
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
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
Элемент формы Panel
    #39844275
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Код: 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
Элемент формы Panel
    #39844639
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Элемент формы Panel
    #39844640
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5. Заметил, что объект Panel имеет как крупное битовое изображение, то есть линия похожа на лестницу. Это особенность объекта Panel, который имеет не высокое разрешение? Или можно как то настроить?
...
Рейтинг: 0 / 0
Элемент формы Panel
    #39844658
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так bitmap же, хотите ровненько - переходите на векторную графику
...
Рейтинг: 0 / 0
Элемент формы Panel
    #39844689
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Элемент формы Panel
    #39844691
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Элемент формы Panel
    #39844697
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут, по шагам разжёвано:
http://csharphelper.com/blog/2018/12/let-the-user-draw-lines-in-c/
...
Рейтинг: 0 / 0
Элемент формы Panel
    #39844753
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Panel есть возможность наносить/удалять слои с изображениями?
...
Рейтинг: 0 / 0
Элемент формы Panel
    #39845014
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkУ Panel есть возможность наносить/удалять слои с изображениями?

Нет.

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


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