Медленное добавление элементов управления в форму - PullRequest
0 голосов
/ 10 августа 2011

Почему краска так долго длится?

public Form1()
    {
        InitializeComponent();
        SuspendLayout();
        double scale = ClientSize.Width / 11;
        for (int i = 1; i < 10; i++)
        {
            for (int j = 1; j < 10; j++)
            {
                everybox[i - 1, j - 1] = new TextBox
                                             {
                                                 Location = new Point((int)(scale * i), (int)(scale * j)),
                                                 Size = new Size((int)scale - 2, (int)scale - 2),
                                                 Multiline = true
                                             };
                Controls.Add(everybox[i - 1, j - 1]);
            }
        }
        ResumeLayout();
    }


private void Form1_Paint(object sender, PaintEventArgs e)
    {
        float scale = ClientSize.Width / 11;
        Graphics g = this.CreateGraphics();
        int counter = 0;
        for (float i = scale; i <= this.ClientSize.Width - scale; i += scale)
        {
            counter++;
            if ((counter - 1) % 3 != 0)
            {
                g.DrawLine(new Pen(Color.Black), new Point((int)i, (int)scale),
                           new Point((int)i, ClientSize.Width - (int)scale));
                g.DrawLine(new Pen(Color.Black), new Point((int)scale, (int)i),
                           new Point(ClientSize.Width - (int)scale, (int)i));
            }
            else
            {
                g.DrawLine(new Pen(Color.Black, 3f), new Point((int)i, (int)scale),
                           new Point((int)i, ClientSize.Width - (int)scale));
                g.DrawLine(new Pen(Color.Black, 3f), new Point((int)scale, (int)i),
                           new Point(ClientSize.Width - (int)scale, (int)i));
            }
        }
    }

Это довольно раздражает и вызывает заметное отставание.everybox - это объект TextBox [9,9].

Ответы [ 4 ]

1 голос
/ 10 августа 2011

За мой комментарий измените:

Graphics g = this.CreateGraphics();

до

e.Graphics
0 голосов
/ 10 августа 2011

Paint определенно может быть вызван много, и если вы получаете слишком много вызовов, это, вероятно, не имеет ничего общего с этим битом кода.Одной вещью, которая может помочь производительности этого конкретного бита, является попытка уменьшить объем работы, которую вы делаете ...

    Graphics g = e.Graphics;
    Pen bp = new Pen(Color.Black, 3f);
    Point start = new Point(0,0);
    Point stop = new Point(0,0);

    for (float i = scale; i <= this.ClientSize.Width - scale; i += scale)
    {
        int iAsInt = (int)i;
        int scaleAsInt = (int)scale;
        int w = ClientSize.Width;
        counter++;

        if ((counter - 1) % 3 != 0)
        {
            start.X = iAsInt;
            start.Y = scaleAsInt;
            stop.X = iAsInt;
            stop.Y = w-scaleAsInt;
            g.DrawLine(Pens.Black, start, stop);
            start.X = scaleAsInt;
            start.Y = iAsInt;
            stop.X = w-scaleAsInt;
            stop.Y = iAsInt;
            g.DrawLine(Pens.Black, start, stop);
            // Note: this looks like more work, but it is actually less
            // your code still has to make all the assignments in addition to 
            // newing up the points (and later having to garbage collect them)
        }
        else
        {
            // TODO: reuse the start/stop points here
            g.DrawLine(bp, new Point(iAsInt, scaleAsInt), new Point(iAsInt, w - scaleAsInt);
            g.DrawLine(bp, new Point(scaleAsInt, iAsInt), new Point(w - scaleAsInt, iAsInt));
        }
    }

Чтобы специально остановить перерисовку ваших строк, посмотрите на элемент ClipRectangle PaintEventArgs.Если часть вашей линии попадает в область прямоугольника клипа, перерисуйте ее.

0 голосов
/ 10 августа 2011

Код, который вы опубликовали, вызывает событие рисования 81 раз (9 * 9). Один раз для каждого элемента управления добавляется в форму. В любом случае это связано с чем-то, что делает форму недействительной, например, перемещение мыши по ней, перемещение другого окна над ней или изменение размера формы. Ответственность может быть за код, который вы нам не показываете.

0 голосов
/ 10 августа 2011

Возможная причина в том, что вы пытаетесь нарисовать слишком много тяжелых компонентов.Если моя математика верна, вы перерисовываете 9 * 9 * 9 * 9 = 6561 объектов.WinForms не предназначены для эффективной перерисовки такого количества компонентов.

Возможно, вам придется подумать, действительно ли вам нужно использовать такое количество тяжелых графических компонентов с WinForms.Могут быть более легкие компоненты или вы можете переключиться на XNA (с камерой, видами и т. Д. - все это уменьшает количество объектов, которые необходимо перерисовать) или WPF в зависимости от контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...