none
Как уменьшить употребительность элемента PictureBox? RRS feed

  • Вопрос

  • На поле много элементов picturebox, и программа зависает, чем можно заменить picturebox или уменьшить его потребность и как решить проблему?

    Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.


Ответы

  • Скачал ваш проект. Правда так и не понял, что он делает, и где там собственно шарики.

    На всякий случай выкладываю пример реализации чегото подобного на GDI+:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Net;
    using System.IO;
    
    namespace WindowsFormsApplication91
    {
        public partial class Form1 : Form
        {
            Image ball;
            List<Point> ballPositions = new List<Point>();
            List<Point> ballVelocity = new List<Point>();
    
            public Form1()
            {
                ball = Image.FromStream(new MemoryStream(
                 new WebClient().DownloadData("http://png.findicons.com/files/icons/547/sport/16/soccer_ball.png")));
                //
                SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
                Size = new Size(800, 600);
                //
                Random rnd = new Random();
                for (int i = 0; i < 200; i++)
                {
                    ballPositions.Add(new Point(rnd.Next(Width), rnd.Next(Height-30)));
                    ballVelocity.Add(new Point(rnd.Next(5)-2, rnd.Next(5)-2));
                }
                Application.Idle += (o, e) =>
                    {
                        for (int i = 0; i < ballPositions.Count; i++)
                        {
                            var v = ballVelocity[i];
                            var p = ballPositions[i];
                            if (p.X > Width - 20 || p.X < 0) v = new Point(-v.X, v.Y);
                            if (p.Y > Height - 35 || p.Y < 0) v = new Point(v.X, -v.Y);
                            ballVelocity[i] = v;
                            p.Offset(v.X, v.Y);
                            ballPositions[i] = p;
                        }
                        Invalidate();
                    };
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                foreach (var b in ballPositions)
                    e.Graphics.DrawImage(ball, b);
            }
        }
    }
    

    А что касается WPF, я бы не советовал вам прямо сейчас вприпрыжку бежать его изучать. В каком-то плане он мощнее WinForms, но он имеет и недостатки, он ориентирован на приложения определенной направленности и он сложнее WinForms.
    • Помечено в качестве ответа Abolmasov Dmitry 10 мая 2012 г. 6:05
    Отвечающий
  • Прошу прощения и за себя и за Algol36, но мой спор с ним по большей части был для вас, так вы новичок и вам легче осваивать сразу новое, чем переучиваться потом. Отсюда и моя настойчивая позиция.

    Нарисовать залитый прямоугольник можно так.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий

Все ответы

  • Что бы понять как уменьшить потребность в picturebox, нужно понять как вы его используете. Опишите задачу подробнее и вам помогут решить проблему.

    Ну и конечно же мое любимое - переходите на WPF и решите огрооомное количество проблем одним махом :)


    Влюблен в WPF Не пишу на C#




    Отвечающий
  • Ну и конечно же мое любимое - переходите на WPF и решите огрооомное количество проблем одним махом :)

    Об этом подумаю, но сначала нужно закончить изучение C# Windows Forms. Можете рассказать чем отличается WPF от C#?

    А на счёт picturebox, к примеру на поле полно элементов picturebox и прога зависает, как решить эту проблему?


    Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.


  • Сначала по первоначальной теме. Вы так и не ответили как именно вы используете picturebox ведь причин может быть масса и вам просто подскажут заменить подход, но пока все абстрактно и помочь вам сложно.

    Теперь о WPF. WPF это платформа а C# это язык программирования, то есть ничего не мешает вам писать приложения WPF с помощью C#. Кроме того если вы только начали изучать программирование то вам как раз и нужно изучать WPF. Это то еже самое что вы решили заняться изучением двигателей и решили сначала изучить паровой двигатель, а потом начать изучение двигателя внутреннего сгорания. WPF от платформы WinForms на первый взгляд отличается принципом дизайна окна, есть ряд внутренних особенностей но в целом все так же - вот вам окно, вот вам элементы управления (только в сто раз мощнее).

    Начать изучать WPF вам поможет вот этот топик.


    Влюблен в WPF Не пишу на C#

    Отвечающий
  • Сначала по первоначальной теме. Вы так и не ответили как именно вы используете picturebox ведь причин может быть масса и вам просто подскажут заменить подход, но пока все абстрактно и помочь вам сложно.

    Теперь о WPF. WPF это платформа а C# это язык программирования, то есть ничего не мешает вам писать приложения WPF с помощью C#. Кроме того если вы только начали изучать программирование то вам как раз и нужно изучать WPF. Это то еже самое что вы решили заняться изучением двигателей и решили сначала изучить паровой двигатель, а потом начать изучение двигателя внутреннего сгорания. WPF от платформы WinForms на первый взгляд отличается принципом дизайна окна, есть ряд внутренних особенностей но в целом все так же - вот вам окно, вот вам элементы управления (только в сто раз мощнее).

    Начать изучать WPF вам поможет вот этот топик.


    Влюблен в WPF Не пишу на C#

    Вы убедили меня, я постараюсь быстро почитать книгу до конца, и потом сразу же перейду к WPF.

    Вот исходник с программой: http://gordon.ucoz.com/Fayls/Files/Fayls/Fayls/shariki.rar

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


    Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.

  • Ну вот теперь можно и ответ дать. Вы используете picturebox  для обычной геометрической фигуры с простым цветом, что является костыльным решением. В данном случае вам лучше вам лучше рисовать эти объекты в нужном месте с помощью GDI+

    Раздел об GDI+ на MSDN - Управляемый код GDI+

    Статья про GDI+ на codeproject - Professional C# - Graphics with GDI+

    НО, теперь я еще больше рекомендую вам переход на WPF. Кроме того, если вы интересуетесь исключительно играми а по вашим ранним топиком я понял, что это так, то вам так же следует глянуть в сторону XNA. Эта платформа именно для написания игр в которой так же можно писать на C#, но ее преимущество над WinForms и WPF в том, что в сможете партировать свою игру для телефона, Xbox и PC. На форуме есть раздел посвященный играм, так же если сильны в англиском ознакомьтесь с этим разделом MSDN. Ну и на течдейс есть масса видео посвященного разработке игр на XNA.


    Влюблен в WPF Не пишу на C#




    • Изменено LXGDARKEditor 5 мая 2012 г. 18:44
    • Предложено в качестве ответа LXGDARKEditor 6 мая 2012 г. 13:42
    Отвечающий
  • Ну вот теперь можно и ответ дать. Вы используете picturebox  для обычной геометрической фигуры с простым цветом, что является костыльным решением. В данном случае вам лучше вам лучше рисовать эти объекты в нужном месте с помощью GDI+

    Раздел об GDI+ на MSDN - Управляемый код GDI+

    Статья про GDI+ на codeproject - Professional C# - Graphics with GDI+

    НО, теперь я еще больше рекомендую вам переход на WPF. Кроме того, если вы интересуетесь исключительно играми а по вашим ранним топиком я понял, что это так, то вам так же следует глянуть в сторону XNA. Эта платформа именно для написания игр в которой так же можно писать на C#, но ее преимущество над WinForms и WPF в том, что в сможете партировать свою игру для телефона, Xbox и PC. На форуме есть раздел посвященный играм, так же если сильны в англиском ознакомьтесь с этим разделом MSDN. Ну и на течдейс есть масса видео посвященного разработке игр на XNA.


    Влюблен в WPF Не пишу на C#




    C# мне нужно выучить ради работы, XNA  я пытался выучить, но не нашёл книгу написанную под последнюю версию.

    Вопрос можно ли написать ту же самую игру на WPF, которую пишем на XNA?

    Это баг?:

    public Form1()
            {
                InitializeComponent();
    
                Graphics G = CreateGraphics();
                Pen P = new Pen(Color.Black, 5);
                G.DrawLine(P, 5, 5, 50, 50);
    
                MessageBox.Show("Hello");
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Graphics G = CreateGraphics();
                Pen P = new Pen(Color.Black, 5);
                G.DrawLine(P, 5, 5, 50, 50);
            }


    При компиляции выдаёт сообщение "Hello", что говорит о том что метод Form1() работает, но косую прямую не рисует, но при нажатии кнопки button1 косую прямую рисует.

    Следующий код тоже не работает:

    private void Form1_Load(object sender, EventArgs e)
            {
                Graphics G = CreateGraphics();
                Pen P = new Pen(Color.Black, 5);
                G.DrawLine(P, 5, 5, 50, 50);
            }

  • По главной теме. Стартовое рисование делайте в событии Form1_Paint. В Load не рисует, потому что форма уже загружена, но еще не прорисована на экране (там пару долей секунды разница, но хватает).

    По теме выбора платформы. Сначала давайте разберемся с терминологией:

    C# - язык программирования. Создан с появлением .Net Framework как эволюция языка C++ для технологии .Net. Язык программирования нужен для создания алгоритма работы программы, логики ее поведения в тех или иных ситуациях.

    WinForms - платформа для написания настольных бизнес приложений (привычных нам оконных приложений). Платформа определяет, то как ОС будет выполнять действия описанные с помощью выбранного языка программирования (C# или VB). Недостаток платформ в том, что она использует API созданные еще во времена первых WIndows и просто не умеет использовать современные возможности PC. Например рисование окна система выполняет с помощью процессора.

    WPF - платформа для написания настольных бизнес приложений. Является развитием устаревшей WinForms, но при этом уходит далеко вперед. Рисование окна в приложении WPF осуществляется силами DirectX, которй в 99% случаев работает с мощностью видео карт а не процессора, отсюда возможность создания красивых бизнес приложений.

    XNA - платформа для создания игр. Как и в предыдущих платформах для описания действий игры используется язык программирования (C# или VB). Отличий WinForms и WPF от XNA много. В вышеописанных платформах используется принцип реакции на событие, произошло событие - пишем действия, нет событий нет действия. В XNA же описывается игровой экран в конкретный момент исходя из неких переменных, которые меняются в зависимости от действий пользователя. Кроме того XNA в отличии от платформ для бизнес приложения можно запускать как на PC так и на приставке Xbox или телефоне с OC Windows.

    Ответ на ваш вопрос "...можно ли написать ту же самую игру на WPF, которую пишем на XNA?". Ответ и ДА и НЕТ. Разные игры будет проще написать или там или там, а некоторые возможно только в XNA. Например ту игру что в пишете сейчас наверное быстрее написать на WPF, а вот игру показанную на этом видео в WPF  за 30 минут вы пожалуй не создадите.

    Итак вам на выбор 3 платформы доступных разработчику для разных целей. Выберите что вам интереснее и что в будете делать чаще и изучайте эту платформу. И бросайте уже эту пещерную WindowForms, не мучайтесь....


    Влюблен в WPF Не пишу на C#


    • Изменено LXGDARKEditor 6 мая 2012 г. 5:16
    • Помечено в качестве ответа Doctor Gordon 6 мая 2012 г. 5:38
    • Снята пометка об ответе Doctor Gordon 6 мая 2012 г. 13:30
    Отвечающий
  • И бросайте уже эту пещерную WindowForms, не мучайтесь....

    Должен сказать спасибо за замечания, но боюсь того что при изучении WPF нужна новая книга и читать всё сначала. Я изучу и то и другое, хотя хочу WPF и XNA.

    Ещё один вопрос, я могу рисовать разные фигуры, но не могу нарисовать квадрат заполненный точками, как picturebox, его копию.


    Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.




  • Скачал ваш проект. Правда так и не понял, что он делает, и где там собственно шарики.

    На всякий случай выкладываю пример реализации чегото подобного на GDI+:

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Net;
    using System.IO;
    
    namespace WindowsFormsApplication91
    {
        public partial class Form1 : Form
        {
            Image ball;
            List<Point> ballPositions = new List<Point>();
            List<Point> ballVelocity = new List<Point>();
    
            public Form1()
            {
                ball = Image.FromStream(new MemoryStream(
                 new WebClient().DownloadData("http://png.findicons.com/files/icons/547/sport/16/soccer_ball.png")));
                //
                SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true);
                Size = new Size(800, 600);
                //
                Random rnd = new Random();
                for (int i = 0; i < 200; i++)
                {
                    ballPositions.Add(new Point(rnd.Next(Width), rnd.Next(Height-30)));
                    ballVelocity.Add(new Point(rnd.Next(5)-2, rnd.Next(5)-2));
                }
                Application.Idle += (o, e) =>
                    {
                        for (int i = 0; i < ballPositions.Count; i++)
                        {
                            var v = ballVelocity[i];
                            var p = ballPositions[i];
                            if (p.X > Width - 20 || p.X < 0) v = new Point(-v.X, v.Y);
                            if (p.Y > Height - 35 || p.Y < 0) v = new Point(v.X, -v.Y);
                            ballVelocity[i] = v;
                            p.Offset(v.X, v.Y);
                            ballPositions[i] = p;
                        }
                        Invalidate();
                    };
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                foreach (var b in ballPositions)
                    e.Graphics.DrawImage(ball, b);
            }
        }
    }
    

    А что касается WPF, я бы не советовал вам прямо сейчас вприпрыжку бежать его изучать. В каком-то плане он мощнее WinForms, но он имеет и недостатки, он ориентирован на приложения определенной направленности и он сложнее WinForms.
    • Помечено в качестве ответа Abolmasov Dmitry 10 мая 2012 г. 6:05
    Отвечающий
  • Прошу прощения и за себя и за Algol36, но мой спор с ним по большей части был для вас, так вы новичок и вам легче осваивать сразу новое, чем переучиваться потом. Отсюда и моя настойчивая позиция.

    Нарисовать залитый прямоугольник можно так.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • Прошу прощения и за себя и за Algol36, но мой спор с ним по большей части был для вас, так вы новичок и вам легче осваивать сразу новое, чем переучиваться потом. Отсюда и моя настойчивая позиция.

    Ясно, но я не ради забавы учу Win, так как на работе могут потребовать именно его.

    Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.

  • Свобода человека в возможности вбирать :) Ваш выбор ваше право.

    Только попрошу вас пометить в этой теме именно тот ответ который отвечает на первый вопрос, что бы упростить поиск ответа другими участниками, а ответ про прямоугольник дан в отдельном топике.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • Выделил сообщения о выборе между WinForm или WPF в отдельный топик - WinForms, WPF - Мнения


    Для связи [mail]