Не получается рисовать на созданном в классе PictureBox`e

77
15 октября 2019, 21:20

Создаю PictureBox в классе, он отображается, но при попытке что-либо отрисовать на нём я получаю целое ничего. Ни ошибки, ни линии. Оставил кусок кода для наглядности. В case оно заходит, но линия не отрисовывается, как и любой другой объект.

class maker
{
    string path;
    string[] file_mass;
    Form1 f1;
    Size s1;
    double[,] mass;
    Graphics gr;
    PictureBox p1;
    Pen pen = new Pen(Color.Red,1);
    public maker(Form1 main_form,string file_path)
    {
        path = file_path;
        f1 = main_form;
        s1 = new Size(500,600);
        p1 = new PictureBox();
        p1.Location = new Point(0, 0);
        p1.Size = s1;
        p1.BackColor=Color.Black;
        f1.Controls.Add(p1);
        f1.Size = s1;
        gr = p1.CreateGraphics();
        draw();
    }
    private void draw()
    {
        _file_mass();
        _mass();
        correct_size_move();
        for (int i = 1; i < mass.GetLength(0); i++)
        {
            switch (mass[i,0])
            {
                case 0:
                    gr.DrawLine(pen, 0, 0, 50, 50);
                    break;
                default:
                    break;
            }
        }
}

При загрузке формы вызываю так:

maker run = new maker(this, @"C:\Users\admin\Desktop\1.txt");
Answer 1
//Graphics gr;
...
  //gr = p1.CreateGraphics();
  p1.Paint += pbPaint;
private void draw()
{
  using (Graphics gr = p1.CreateGraphics())
  {
    draw(gr);
  }
}
private void pbPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
  draw(e.Graphics);
}
private void draw(Graphics gr)
{
    _file_mass();
    _mass();
    correct_size_move();
    for (int i = 1; i < mass.GetLength(0); i++)
    {
        switch (mass[i,0])
        {
            case 0:
                gr.DrawLine(pen, 0, 0, 50, 50);
                break;
            default:
                break;
        }
    }
}

Или создайте картинку, нарисуйте на ней и назначьте p1.Image.

Метод pbPaint используется как обработчик события Paint. Это событие происходит всякий раз, когда контролу надо перерисоваться.

Когда мы при создании контролов вызываем draw() без параметров, мы что-то рисуем на поверхности контрола p1. При ближайшей перерисовке контрола, то, что мы нарисовали, исчезнет. Так как draw() вызывается до появления формы на экране, думаю, что мы этого вообще не увидим. И вот тут мы используем событие Paint - рисуем все каждый раз, когда контрол сообщает нам, что он перерисовывает свою поверхность.

READ ALSO
Концепция ControlTemplate

Концепция ControlTemplate

Немного туманная для меня эта концепция

102
загрузка csv в БД SQL C#

загрузка csv в БД SQL C#

Необходимо загрузить большой csv файл в БД (1,5 Гб)Пробовал делать построчную запись с помощью INSERT - это очень долго

97
Task.Run - антипаттерн async/await? C#

Task.Run - антипаттерн async/await? C#

Недавно прочитал статью на хабре (upd: из комментов понял, что нужно прицепить цитату, по которой далее вопрос)

90
библиотека PHPExcel

библиотека PHPExcel

Подскажите как сделать дозапись в ексель файл с помощью PHP Excel Те

129