Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2012, 15:42   #1
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию клонирование (дублирование) pictureBox

Вопрос в следующем, как сделать клон картинки, есть ли возможность унаследовать все параметры кроме ее координат?

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

Код:
public partial class Form1 : Form
    {
        
        Timer Timer1 = new Timer();
        public Form1()
        {
            
            InitializeComponent();
            Timer1.Start();
            Timer1.Interval = 1000;
            Timer1.Tick += new EventHandler(Timer1_Tick);
            
        }
        Int16 Time1 = 0;
        void Timer1_Tick(object sender, EventArgs e)
        {
            for (; Time1 == 30; Time1++)
                ;//здесь будет создаваться клон pictureBox
        }
    }
Программист это не профессия, программист - это образ жизни.

Последний раз редактировалось Prizrak86; 03.02.2012 в 15:44. Причина: не точно описал заголовок
Prizrak86 вне форума Ответить с цитированием
Старый 03.02.2012, 18:28   #2
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию

элемент меняет свое положение но при этом предыдущий элемент удаляется, почему?

Код:
public partial class Form1 : Form
    {
        Random r = new Random();
        PictureBox[] pb = new PictureBox[1000];
        UInt16 pbox = 0;
        Timer Timer1 = new Timer();
        public Form1()
        {
            
            InitializeComponent();
            Timer1.Start();
            Timer1.Interval = 1000;
            Timer1.Tick += new EventHandler(Timer1_Tick);
            
        }
        Int16 Time1 = 0;
        void Timer1_Tick(object sender, EventArgs e)
        {
            for (; Time1 == 1; )
            {
                pb[pbox] = pictureBox1;
                pb[pbox].Location = new Point(r.Next(this.Size.Width / 2), r.Next(this.Size.Height / 2));
                this.Controls.Add(pb[pbox]);
                pbox++;
                Time1 = 0;
            }
            Time1++;
        }  
    }
Программист это не профессия, программист - это образ жизни.
Prizrak86 вне форума Ответить с цитированием
Старый 03.02.2012, 19:29   #3
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
Радость

в итоге получилось так

Код:
public partial class Form1 : Form
    {
        Random r = new Random();
        PictureBox[] pb = new PictureBox[1000];
        UInt16 pbox = 0,Time1 = 1;
        Timer Timer1 = new Timer();
        public Form1()
        {
            
            InitializeComponent();
            Timer1.Start();
            Timer1.Interval = 1000;
            Timer1.Tick += new EventHandler(Timer1_Tick);
            
        }
        void Timer1_Tick(object sender, EventArgs e)
        {
            for (; Time1 == 1; )
            {
                pb[pbox] = new PictureBox();
                pb[pbox].Image = pictureBox1.Image;
                pb[pbox].Size = pictureBox1.Size;
                pb[pbox].Location = new Point(r.Next(this.Size.Width / 2), r.Next(this.Size.Height / 2));
                this.Controls.Add(pb[pbox]);
                pbox++;
                Time1 = 0;
            }
            Time1++;
        }  
    }
сам спросил, сам ответил.
Программист это не профессия, программист - это образ жизни.
Prizrak86 вне форума Ответить с цитированием
Старый 03.02.2012, 19:38   #4
alexey2
Пользователь
 
Регистрация: 27.01.2012
Сообщений: 37
По умолчанию

потому что picture box является ссылочным типом, в переменной содержится указатель, и просто меняется его свойство location. Похоже без создания нового объекта не обойтись, с переустановкой свойств.

пока писал уже разобрался )
alexey2 вне форума Ответить с цитированием
Старый 03.02.2012, 19:46   #5
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию

Цитата:
Сообщение от alexey2 Посмотреть сообщение
потому что picture box является ссылочным типом, в переменной содержится указатель, и просто меняется его свойство location.
то есть получается что если я пишу
Код:
pb[pbox]=pictureBox1;
я просто передаю набор ссылок и параметров от pictureBox1 и любые изменения в массиве это эквивалент того что я на прямую буду изменять параметры pictureBox1.
правильно я понимаю ситуацию?
Программист это не профессия, программист - это образ жизни.
Prizrak86 вне форума Ответить с цитированием
Старый 03.02.2012, 20:02   #6
rUs_LAN
Форумчанин
 
Регистрация: 15.11.2008
Сообщений: 577
По умолчанию

да, вот из какой-то книги

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RefAndVal
{
    //Тип по ссилці
    class RefTypeRectangle
    {
        public int Width { get; set; }
        public int Height { get; set; }        
    }

    //Структура (тип по значенню)
    struct ValTypeRectangle
    {
        public int Width;
        public int Height;
    }

    class RefValTest
    {
        public static void Main()
        {
            RefTypeRectangle rect1 = new RefTypeRectangle();
            rect1.Width = 10;
            rect1.Height = 15;
            RefTypeRectangle rect2 = rect1;
            Console.WriteLine("Dimention of rect 2 is " + rect2.Height  +" x " + rect2.Width);

            Console.WriteLine("Changing dimation of rect1...");
            rect1.Width = 20;
            rect1.Height = 25;

            Console.WriteLine("Dimention of rect 2 now are " + rect2.Height + " x " + rect2.Width);

            ValTypeRectangle rect3 = new ValTypeRectangle();
            rect3.Width = 10;
            rect3.Height = 15;

            ValTypeRectangle rect4 = rect3;

            Console.WriteLine("Dimention of rect 4 is " + rect4.Height + " x " + rect4.Width);
            Console.WriteLine("Changing dimation of rect3...");
            rect3.Width = 20;
            rect3.Height = 25;

            Console.WriteLine("Dimention of rect 4 now are " + rect4.Height + " x " + rect4.Width);

            Console.ReadKey(true);

     
        }
    }
}
rUs_LAN вне форума Ответить с цитированием
Старый 03.02.2012, 20:04   #7
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию

я вот смысла get и set все не пойму.
Программист это не профессия, программист - это образ жизни.
Prizrak86 вне форума Ответить с цитированием
Старый 03.02.2012, 20:24   #8
rUs_LAN
Форумчанин
 
Регистрация: 15.11.2008
Сообщений: 577
По умолчанию

это я просто prop (шаблон такой у визуалстудио или как оно называется тестировал )

ну типа пишешь prop и нажимаешь tab, так же с for, недавно увидел вот проверяю на практике
rUs_LAN вне форума Ответить с цитированием
Старый 03.02.2012, 20:45   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
я вот смысла get и set все не пойму.
автосвойство в выделением поля под него(автоматического также).
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.02.2012, 22:36   #10
Prizrak86
Форумчанин
 
Аватар для Prizrak86
 
Регистрация: 15.10.2011
Сообщений: 139
По умолчанию

я тут по шаманил с моим маленьким бубном, вот что получились

Код:
public partial class Form1 : Form
    {
        Random r = new Random();
        PictureBox[] pb = new PictureBox[1000];
        UInt16 pbox = 0, Time1 = 1, MR=100;
        Timer Timer1 = new Timer();
        bool b = true;
        public Form1()
        {
            
            InitializeComponent();
            Timer1.Start();
            Timer1.Interval = 1;
            Timer1.Tick += new EventHandler(Timer1_Tick);
        }
        void Timer1_Tick(object sender, EventArgs e)
        {
            if (b) { pictureBox1.Location = new Point(r.Next(this.Size.Width-MR-pictureBox1.Size.Width), r.Next(this.Size.Height-MR-pictureBox1.Size.Height)); b = false; }
            for (; Time1 == 1 && pbox<1000; )
            {
                UInt16 R = (UInt16)r.Next(1, MR+1);
                int x, y;
                pb[pbox] = new PictureBox();
                pb[pbox].Image = pictureBox1.Image;
                pb[pbox].Size = pictureBox1.Size;
                x = r.Next(-R,R+1);
                y = (int)Math.Sqrt(Math.Pow(R, 2) - Math.Pow(x, 2));
                if (pbox % 2 == 0) y *= -1;
                x += pictureBox1.Location.X;
                y += pictureBox1.Location.Y;
                pb[pbox].Location = new Point(x, y);
                this.Controls.Add(pb[pbox]);
                pbox++;
                Time1 = 0;
                if (pbox == 999) pbox = 0;
            }
            Time1++;
        }  
    }


маленькая круглая поляна не выходящая за пределы экрана и растущая вокруг общего центра коим является pictureBox который выбирает свои координаты произвольно.
Изображения
Тип файла: jpg Безымянный.jpg (47.3 Кб, 162 просмотров)
Программист это не профессия, программист - это образ жизни.

Последний раз редактировалось Prizrak86; 03.02.2012 в 22:38.
Prizrak86 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с picturebox tanek Помощь студентам 4 02.08.2011 11:26
Массив PictureBox Anuta* Windows Forms 0 23.05.2011 14:19
PictureBox. C# Novi4ok_11 Помощь студентам 8 28.02.2011 18:24
PictureBox ne11son Общие вопросы .NET 0 14.03.2009 12:29
Прозрачность в PictureBox _Dmitry Общие вопросы .NET 3 24.06.2008 20:33