none
Как объявит коллекцию GDI+ RRS feed

  • Вопрос

  • Нужно сканировать нарисованные фотки GDI+,

    у picturebox мы объявляли коллекцию и потом писали чтото вроде этого: pictures[2]...

    Нужно тоже самое с GDI+.


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

    • Перемещено PashaPash 8 мая 2012 г. 14:55 (От:Языки программирования)

Ответы

  • Проблема в том, что вы не следите за линией данного топика, возможно потому что пытаетесь найти ответ где то еще. Этот проблемный код вы уже писали выше и вам объяснили что не он не будет работать. В частности я объяснил вам что Graphics это кисточка которой вы рисуете и фактически она никуда не сохраняется и не имеет ничего похожего на Width.

    Повторюсь еще раз перечитайте этот топик с начала, не торопясь и вдумчиво - как говорится если застрял, начни сначала.

    Ну и извините за не сдержанность, но где же заявленная простота WinForms? У меня мозг кипит, а я уже разобрался что к чему, как же тогда вы мучаетесь с этой "простой" платформой...


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

    • Помечено в качестве ответа Doctor Gordon 9 мая 2012 г. 14:37
    Отвечающий

Все ответы

  • Используйте коллекцию из объектов bitmap

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

    Отвечающий
  • Используйте коллекцию из объектов bitmap

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

    Можете дать код следующего типа: на поле 2 Rectangle, нужно просканировать их через цикл for и узнать ширину.

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

  • Не правильно понял ваш первый вопрос. К сожалению изрядно подзабыл рисование GDI+, поэтому помочь будет сложновато

    Если кинете код того как вы рисует эти 2 Rectangle, то попробую напрячься и помочь.


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

    Отвечающий
  • Если кинете код того как вы рисует эти 2 Rectangle, то попробую напрячься и помочь.

            private void button1_Click(object sender, EventArgs e)
            {
                G = CreateGraphics();
                S = new SolidBrush(Color.Black);
                G.FillRectangle(S, 10, 10, 50, 50);
                G.FillRectangle(S, 10, 70, 50, 50);
            }



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

  • Честно говоря затрудняюсь ответить. Вам придется подождать ответа тех, кто часто использует GDI+ и помнит что там к чему.


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

    Отвечающий
  • Нужно сканировать нарисованные фотки GDI+,

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

    Например я нажал на прямоугольник с целью переместить его в другое место. Вы проходите по коллекции и проверяете в координаты какого прямоугольника попадают координаты мыши. Затем меняете значение координат на новые в коллекции и выполняете перерисовку окна. То есть в коллекции вам достаточно хранить объекты с полями "координата X", "коордената Y", "ширина", высота", "цвет".


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

    Отвечающий
  • Исходя из рекомендаций Algol36 я бы посоветовал сделать вам глобальную коллекцию куда в будете записывать вновьнарисованные прямоугольники и работать именно с этой коллекцией. GDI+ же будет выполнять у вас исключительно функцию рисования.

    Например я нажал на прямоугольник с целью переместить его в другое место. Вы проходите по коллекции и проверяете в координаты какого прямоугольника попадают координаты мыши. Затем меняете значение координат на новые в коллекции и выполняете перерисовку окна. То есть в коллекции вам достаточно хранить объекты с полями "координата X", "коордената Y", "ширина", высота", "цвет".

    Проблема в том что на поле много рисунков, с picturebox  я сделал и уже доканчивал игру, а тут эта проблема.

    GDI+ же будет выполнять у вас исключительно функцию рисования.

    Тоесть коллекцию сделать невозможно?


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


  • Для того что бы проект WinForms работал более или менее быстро вам придется переписать его на GDI+, то есть по сути начать все с начала, но с другой стороны вы отработали сам алгоритм изучили что то важное и может стоит пробовать новое в новом проекте.

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

    Отвечающий
  • Для того что бы проект WinForms работал более или менее быстро вам придется переписать его на GDI+, то есть по сути начать все с начала, но с другой стороны вы отработали сам алгоритм изучили что то важное и может стоит пробовать новое в новом проекте.

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

    Я уже начал всё сначала, проблема в том что как просканировать рисунки циклом for?

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

  • Так а совет Algol36 вам не подходит? Можно записвать все данне о нарисованных объектах в момент их рисования. Если вам это не подходит опишите почему, то есть конкретнее вашу задачу.

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

    Отвечающий
  • Так а совет Algol36 вам не подходит? Можно записвать все данне о нарисованных объектах в момент их рисования. Если вам это не подходит опишите почему, то есть конкретнее вашу задачу.

    Подходит и думаю вы имеете ввиду List, вот код:

            Graphics G;
            SolidBrush S;
            List<Graphics> ListG;
    
            private void button1_Click(object sender, EventArgs e)
            {
                G = CreateGraphics();
                S = new SolidBrush(Color.Black);
                G.FillRectangle(S, 10, 10, 10, 10);
                G.FillRectangle(S, 25, 10, 10, 10);
                ListG = new List<Graphics>();
                ListG.Add(G);
            }

    Дальше должно быть чтото вроде ListG[1].Width, не знаю как это сделать.


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


  • А у объекта Graphics вообще есть свойство Width? Не уверен что так просто получится. Скорее всего вам придется делать отдельнй класс (например Figure) и делать поля как я писал выше "координата X", "коордената Y", "ширина", высота", "цвет". Затем делать коллекцию из этого класса. Как то так.

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

    Отвечающий
  • А у объекта Graphics вообще есть свойство Width? Не уверен что так просто получится. Скорее всего вам придется делать отдельнй класс (например Figure) и делать поля как я писал выше "координата X", "коордената Y", "ширина", высота", "цвет". Затем делать коллекцию из этого класса. Как то так.

    Ясно, у меня есть идея, я могу задать ширину и высоту переменными, потом использовать эти переменные.

    А по вашим словам выходит что нужно каждый рисунок охаразектировать, а если много рисунков тогда никак или я неправильно понял?

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


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



  • Не очень понимаю смысл фразы "сканирование графики как у picturebox". Может поэтому я и затрудняюсь ответить. Опишите задачу более конкретно.

    Например насколько сложен каждый рисунок, из каких фигур он будет состоять, какие манипуляции планируется с ним делать.


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


    Отвечающий
  • Не очень понимаю смысл фразы "сканирование графики как у picturebox". Может поэтому я и затрудняюсь ответить. Опишите задачу более конкретно.

                PictureBox pictubox1 = new PictureBox();
                PictureBox pictubox2 = new PictureBox();
                var pictures = Controls.OfType<PictureBox>().ToList();
                for (int i = 0; i < pictures.Count; i++)
                    pictures[i].Width = 5;

    Нужно тоже самое с графикой, чтото на подобии следующего кода, который не работает:

                var GS = Controls.OfType<Graphics>().ToList();
                GS[1].Width


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

  • OMG :)

    
    Doctor Gordon, объясните задачу которую вы решаете. Зачем вы уменьшаете ширину пикчербоксов?
    Отвечающий
  • Не уверен, что так получится... пусть меня поправят если не так.
    Давайте разбираться. Если я все правильно понял, то Graphics это кисточка (метафорично), когда вы вызываете GetGraphics вы запрашиваете холст, а потом кисточкой рисуете на холсте, но саму кисточку на холст вы не крепите, поэтому фактически в коллекции Controls объектов Graphics не будет. Когда же вы работаете с picturebox вы как бы приклеиваете их к холсту, а значит обход по коллекции и поиск работает. Если я все правильно понял, то в варианте с кисточкой (Graphics) перед рисованием придется занести в журнал (коллекция о которой я писал вше) что было нарисовано, какие имело размеры и цвет, а потом работать с журналом.


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

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

    Как занести?

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

  • Ну что же раз других вариантов не было (дал время, не стал отвечать) значит мы или в верном направлении, или другого направления никто подсказать не может.

    Под журналом я подразумеваю коллекцию List из вашего собственного класса. Например такого:

    Public Class Figure
        Dim XValue As Integer
        Dim YValue As Integer
        Dim HeightValue As Integer
        Dim WidthValue As Integer
        Dim BrushColorValue As Brush
        Public Sub New(_x As Integer, _y As Integer, _height As Integer, _width As Integer, _brushcolor As Brush)
            X = _x
            Y = _y
            Height = _height
            Width = _width
            BrushColor = _brushcolor
        End Sub
        Public Property X As Integer
            Get
                Return XValue
            End Get
            Set(value As Integer)
                XValue = value
            End Set
        End Property
        Public Property Y As Integer
            Get
                Return YValue
            End Get
            Set(value As Integer)
                YValue = value
            End Set
        End Property
        Public Property Height As Integer
            Get
                Return HeightValue
            End Get
            Set(value As Integer)
                HeightValue = value
            End Set
        End Property
        Public Property Width As Integer
            Get
                Return WidthValue
            End Get
            Set(value As Integer)
                WidthValue = value
            End Set
        End Property
        Public Property BrushColor As Brush
            Get
                Return BrushColorValue
            End Get
            Set(value As Brush)
                BrushColorValue = value
            End Set
        End Property
    End Class
    Перечитайте этот топик с начала, я уже описывал как обращаться с коллекцией из такого класса, что бы это было похоже на ведение журнал. Конвертировать код из VB в C# можно тут.



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

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

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

    Вот проблемный код:

                G = CreateGraphics();
                S = new SolidBrush(Color.Black);
                G.FillRectangle(S, 10, 10, 10, 10);
                G.FillRectangle(S, 25, 10, 10, 10);
                ListG = new List<Graphics>();
                ListG.Add(G);

    После этого кода должно получиться чтото вроде этого:

    ListG[1].Width //этот код не работает

    Это возможно или невозможно?

    Если невозможно то у меня есть вариант записи размеров в массив при создании, что выбрать?


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

  • Проблема в том, что вы не следите за линией данного топика, возможно потому что пытаетесь найти ответ где то еще. Этот проблемный код вы уже писали выше и вам объяснили что не он не будет работать. В частности я объяснил вам что Graphics это кисточка которой вы рисуете и фактически она никуда не сохраняется и не имеет ничего похожего на Width.

    Повторюсь еще раз перечитайте этот топик с начала, не торопясь и вдумчиво - как говорится если застрял, начни сначала.

    Ну и извините за не сдержанность, но где же заявленная простота WinForms? У меня мозг кипит, а я уже разобрался что к чему, как же тогда вы мучаетесь с этой "простой" платформой...


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

    • Помечено в качестве ответа Doctor Gordon 9 мая 2012 г. 14:37
    Отвечающий
  • В частности я объяснил вам что Graphics это кисточка которой вы рисуете и фактически она никуда не сохраняется и не имеет ничего похожего на Width.

    Шась окончательно дошло, извините, значит нужно сохранят всё в массив, и невозможно сохранить в List так чтобы потом открывать так List<Graphics>[0].Width.


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