Лучший отвечающий
Как объявит коллекцию GDI+

Вопрос
-
Нужно сканировать нарисованные фотки GDI+,
у picturebox мы объявляли коллекцию и потом писали чтото вроде этого: pictures[2]...
Нужно тоже самое с GDI+.
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
- Перемещено PashaPash 8 мая 2012 г. 14:55 (От:Языки программирования)
7 мая 2012 г. 13:46
Ответы
-
Проблема в том, что вы не следите за линией данного топика, возможно потому что пытаетесь найти ответ где то еще. Этот проблемный код вы уже писали выше и вам объяснили что не он не будет работать. В частности я объяснил вам что Graphics это кисточка которой вы рисуете и фактически она никуда не сохраняется и не имеет ничего похожего на Width.
Повторюсь еще раз перечитайте этот топик с начала, не торопясь и вдумчиво - как говорится если застрял, начни сначала.
Ну и извините за не сдержанность, но где же заявленная простота WinForms? У меня мозг кипит, а я уже разобрался что к чему, как же тогда вы мучаетесь с этой "простой" платформой...
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
- Помечено в качестве ответа Doctor Gordon 9 мая 2012 г. 14:37
9 мая 2012 г. 11:48Отвечающий
Все ответы
-
7 мая 2012 г. 14:04Отвечающий
-
Используйте коллекцию из объектов bitmap
Можете дать код следующего типа: на поле 2 Rectangle, нужно просканировать их через цикл for и узнать ширину.
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
7 мая 2012 г. 14:17 -
Не правильно понял ваш первый вопрос. К сожалению изрядно подзабыл рисование GDI+, поэтому помочь будет сложновато
Если кинете код того как вы рисует эти 2 Rectangle, то попробую напрячься и помочь.
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
7 мая 2012 г. 14:25Отвечающий -
Если кинете код того как вы рисует эти 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); }
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
7 мая 2012 г. 14:28 -
Честно говоря затрудняюсь ответить. Вам придется подождать ответа тех, кто часто использует GDI+ и помнит что там к чему.
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
7 мая 2012 г. 15:05Отвечающий -
Нужно сканировать нарисованные фотки GDI+,
7 мая 2012 г. 19:30Отвечающий -
Исходя из рекомендаций Algol36 я бы посоветовал сделать вам глобальную коллекцию куда в будете записывать вновьнарисованные прямоугольники и работать именно с этой коллекцией. GDI+ же будет выполнять у вас исключительно функцию рисования.
Например я нажал на прямоугольник с целью переместить его в другое место. Вы проходите по коллекции и проверяете в координаты какого прямоугольника попадают координаты мыши. Затем меняете значение координат на новые в коллекции и выполняете перерисовку окна. То есть в коллекции вам достаточно хранить объекты с полями "координата X", "коордената Y", "ширина", высота", "цвет".
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
7 мая 2012 г. 19:43Отвечающий -
Исходя из рекомендаций Algol36 я бы посоветовал сделать вам глобальную коллекцию куда в будете записывать вновьнарисованные прямоугольники и работать именно с этой коллекцией. GDI+ же будет выполнять у вас исключительно функцию рисования.
Например я нажал на прямоугольник с целью переместить его в другое место. Вы проходите по коллекции и проверяете в координаты какого прямоугольника попадают координаты мыши. Затем меняете значение координат на новые в коллекции и выполняете перерисовку окна. То есть в коллекции вам достаточно хранить объекты с полями "координата X", "коордената Y", "ширина", высота", "цвет".
Проблема в том что на поле много рисунков, с picturebox я сделал и уже доканчивал игру, а тут эта проблема.
GDI+ же будет выполнять у вас исключительно функцию рисования.
Тоесть коллекцию сделать невозможно?
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
- Изменено Doctor Gordon 8 мая 2012 г. 3:12
8 мая 2012 г. 3:11 -
Для того что бы проект WinForms работал более или менее быстро вам придется переписать его на GDI+, то есть по сути начать все с начала, но с другой стороны вы отработали сам алгоритм изучили что то важное и может стоит пробовать новое в новом проекте.
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
8 мая 2012 г. 3:29Отвечающий -
Для того что бы проект WinForms работал более или менее быстро вам придется переписать его на GDI+, то есть по сути начать все с начала, но с другой стороны вы отработали сам алгоритм изучили что то важное и может стоит пробовать новое в новом проекте.
Я уже начал всё сначала, проблема в том что как просканировать рисунки циклом for?
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
8 мая 2012 г. 4:15 -
Так а совет Algol36 вам не подходит? Можно записвать все данне о нарисованных объектах в момент их рисования. Если вам это не подходит опишите почему, то есть конкретнее вашу задачу.
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
8 мая 2012 г. 6:37Отвечающий -
Так а совет 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, не знаю как это сделать.
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
- Изменено Doctor Gordon 8 мая 2012 г. 8:27
8 мая 2012 г. 8:27 -
А у объекта Graphics вообще есть свойство Width? Не уверен что так просто получится. Скорее всего вам придется делать отдельнй класс (например Figure) и делать поля как я писал выше "координата X", "коордената Y", "ширина", высота", "цвет". Затем делать коллекцию из этого класса. Как то так.
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
8 мая 2012 г. 9:18Отвечающий -
А у объекта Graphics вообще есть свойство Width? Не уверен что так просто получится. Скорее всего вам придется делать отдельнй класс (например Figure) и делать поля как я писал выше "координата X", "коордената Y", "ширина", высота", "цвет". Затем делать коллекцию из этого класса. Как то так.
Ясно, у меня есть идея, я могу задать ширину и высоту переменными, потом использовать эти переменные.
А по вашим словам выходит что нужно каждый рисунок охаразектировать, а если много рисунков тогда никак или я неправильно понял?
Если честно очень важно сканирование графики как у picturebox, без этого я не смогу делать другие игры.
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
- Изменено Doctor Gordon 8 мая 2012 г. 11:08
8 мая 2012 г. 11:06 -
Не очень понимаю смысл фразы "сканирование графики как у picturebox". Может поэтому я и затрудняюсь ответить. Опишите задачу более конкретно.
Например насколько сложен каждый рисунок, из каких фигур он будет состоять, какие манипуляции планируется с ним делать.
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
- Изменено LXGDARKEditor 8 мая 2012 г. 11:24
8 мая 2012 г. 11:23Отвечающий -
Не очень понимаю смысл фразы "сканирование графики как у 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
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
8 мая 2012 г. 14:17 -
OMG :)
Doctor Gordon, объясните задачу которую вы решаете. Зачем вы уменьшаете ширину пикчербоксов?8 мая 2012 г. 14:29Отвечающий -
Не уверен, что так получится... пусть меня поправят если не так.
Давайте разбираться. Если я все правильно понял, то Graphics это кисточка (метафорично), когда вы вызываете GetGraphics вы запрашиваете холст, а потом кисточкой рисуете на холсте, но саму кисточку на холст вы не крепите, поэтому фактически в коллекции Controls объектов Graphics не будет. Когда же вы работаете с picturebox вы как бы приклеиваете их к холсту, а значит обход по коллекции и поиск работает. Если я все правильно понял, то в варианте с кисточкой (Graphics) перед рисованием придется занести в журнал (коллекция о которой я писал вше) что было нарисовано, какие имело размеры и цвет, а потом работать с журналом.Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
8 мая 2012 г. 14:40Отвечающий -
в варианте с кисточкой (Graphics) перед рисованием придется занести в журнал (коллекция о которой я писал вше) что было нарисовано, какие имело размеры и цвет, а потом работать с журналом.
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
8 мая 2012 г. 15:13 -
Ну что же раз других вариантов не было (дал время, не стал отвечать) значит мы или в верном направлении, или другого направления никто подсказать не может.
Под журналом я подразумеваю коллекцию 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#!
9 мая 2012 г. 7:06Отвечающий -
Под журналом я подразумеваю коллекцию 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 //этот код не работает
Это возможно или невозможно?
Если невозможно то у меня есть вариант записи размеров в массив при создании, что выбрать?
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
9 мая 2012 г. 11:34 -
Проблема в том, что вы не следите за линией данного топика, возможно потому что пытаетесь найти ответ где то еще. Этот проблемный код вы уже писали выше и вам объяснили что не он не будет работать. В частности я объяснил вам что Graphics это кисточка которой вы рисуете и фактически она никуда не сохраняется и не имеет ничего похожего на Width.
Повторюсь еще раз перечитайте этот топик с начала, не торопясь и вдумчиво - как говорится если застрял, начни сначала.
Ну и извините за не сдержанность, но где же заявленная простота WinForms? У меня мозг кипит, а я уже разобрался что к чему, как же тогда вы мучаетесь с этой "простой" платформой...
Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!
- Помечено в качестве ответа Doctor Gordon 9 мая 2012 г. 14:37
9 мая 2012 г. 11:48Отвечающий -
В частности я объяснил вам что Graphics это кисточка которой вы рисуете и фактически она никуда не сохраняется и не имеет ничего похожего на Width.
Шась окончательно дошло, извините, значит нужно сохранят всё в массив, и невозможно сохранить в List так чтобы потом открывать так List<Graphics>[0].Width.
Бог движок на котором мы написаны, а Библия компилятор, и верующие постоянно компилируют себя в нём.
9 мая 2012 г. 14:37