PictureBox tworzenie dynamicznie

0

Witam

Chciałbym móc tworzyć pictureboxy dynamicznie, chodzi mi mniej więcej o takie coś, że wczytuje z dysku obrazek i wrzucam go do pictureboxa (ewentualnie jeszcze na listę) następnie wciskam przycisk i wrzucam kolejny obrazek na nastęnego pictueboxa i chodzi mi to, żeby tworzyły się one pod sobą. Wiem ja kwrzucić z dysku obrazek wiem jak go załadowadc na pcitureboxa, ale nie mam pojęcia jak zrobić takie coś.

0
WuWu napisał(a)

Witam

Chciałbym móc tworzyć pictureboxy dynamicznie
ależ możesz, a na necie jest od metra tutoriali jak tworzyć komponenty dynamicznie

0

Ok, trochę się źle wyraziłem wiem jak storzyć dynamicznego pictureboxa, ale nie wiem jak zrobić żeby wczytywać obrazki wybrane z dysku twardego... używając dynamicznych pciture boxów bo dla pojedyńczego potrafie. Chodzi o to, żeby wczytywać kolejne obrazki które będą umieszcane pod soba jeden pod drugim.

0

dalej nie wiem z czym masz problem - potrafisz wczytać z kodu obrazek do PB rzuconego na formę? - w stworzonym dynamicznie robi się to tak samo. Napisałeś, że stworzyć też potrafisz więc z czym masz problem?

0

Chyba chodzi Ci o coś takiego:

  1. Podajesz programowi ścieżkę
  2. On sprawdza czy w danym katalogu są obrazki: http://msdn.microsoft.com/en-us/library/wz42302f.aspx
  3. Jeśli są to je wczytuje i tworzy dynamicznie
0

Jeżeli Ci chodzi i konkretne przypisanie obrazka do PictureBox'a to zrób klasę oddzielną i tam miej index PictureBox'a (aktualnej instancji) i sam PictureBox. Tworzysz sobie ileś tam instancji i teraz zrób sobie inną statyczną klasę albo zwykłą tablicę, gdzie będziesz trzymał dla każdego indexu (0...n) inną ścieżkę do pliku lub sobie połącz index z nazwą pliku, że dla instancji "4" wczytuje "4.bmp".

0

Może trochę źle to ująłem... Chodzi mi o to, że mam przycisk powiedzmy "dodaj" i teraz tworzę możliwość wybrania konkretnego pliku (obrazka jpg/bmp) przy użyciu OpenFileDialog
"OpenFileDialog okienkoWczytaniaPliku = new OpenFileDialog();". I teraz chcę wrzucic to sobie np. z lewej strony u góry na formę do pictureboxa, następnie jeśli będę chciał dodać następny obrazek wciskam "dodaj" i dodaje mi ten obrazek do kolejnego pictureboxa, który jest tworzony w momencie dodania kolejnego pliku i umieszczazny pod wczesniejszym pictureboxem przy czym ten wcześniejszy obrazek jest zachowany czyli mamy dwa obrazki pod sobą.

0

Zrób więc konstruktor z nazwą obrazka i wczytuj z OpenFileDialog.FileName do konstruktora tą właśnie nazwę. (opisuję to wg mojej klasy) Teraz w konstruktorze ładuję sobie np. prywatne pole Picture na plik z parametru, który jest nazwą obrazka. PictureBox dodaję na formę i gotowe. A co do wyświetlania następnego obrazka pod spodem, to tak:
Pobieram wysokość poprzedniego obrazka (to też możesz wwalić do jakieś zmiennej) i dodaję do tego tzw. spacing czyli odległość między czymś a czymś np. 10px i w tych współrzędnych wyświetlam drugi PictureBox, przyczym pierw tworzę nową instancję i to samo co na początku. Już dokładniej się nie da :)

0

http://pyp.net.pl/source/4e1827bd6452e nie dawno pisalem prosta przegladarke zdjec...zlukaj sobie wszystkiego tam nie ma...ale zawsze cos

0

Powiedzmy, że pocześci sobie poradziłem, zrobiłem coś takiego. Teraz chciałbym aby dodawać kolejne obrazki poniżej teg pierwszego, ale jakoś mam problem z poradzeniem sobie z tym. A i jeszce jak umieścić to na Panelu(panel1)?

 
 if (okienkoWczytaniaPliku.ShowDialog() == DialogResult.OK)
            {  
               int pozycjaX, pozycjaY;
               pozycjaX = 30;
               pozycjaY = 60;
               int ile = 10;
               for (int indeksObrazka = 0; indeksObrazka < ile; indeksObrazka++)
               {
                   PictureBox box = new PictureBox();
                   box.Top = 200;
                   box.Width = 220;
                   box.Height = 250;
                   box.Left = 100;
                   box.SizeMode = PictureBoxSizeMode.StretchImage;
                  
                   for (int i=1; i<=ile; i++)
                   box.Location = new System.Drawing.Point(pozycjaX, pozycjaY);
                   Controls.Add(box);
                   box.Image = Image.FromFile(okienkoWczytaniaPliku.FileName);


0

sorry tutaj poprawny kod

 OpenFileDialog okienkoWczytaniaPliku = new OpenFileDialog();
            okienkoWczytaniaPliku.Filter = "Pliki graficzne (jpg)|*.jpg|Pliki graficzne (bmp)|*.bmp";

            if (okienkoWczytaniaPliku.ShowDialog() == DialogResult.OK)
            {  
               int pozycjaX, pozycjaY;
               pozycjaX = 30;
               pozycjaY = 60;
               int ile = 10;
               for (int indeksObrazka = 0; indeksObrazka < ile; indeksObrazka++)
               {
                   PictureBox box = new PictureBox();
                   box.Top = 200;
                   box.Width = 220;
                   box.Height = 250;
                   box.Left = 100;
                   box.SizeMode = PictureBoxSizeMode.StretchImage;
                  
                   for (int i=1; i<=ile; i++)
                   box.Location = new System.Drawing.Point(pozycjaX, pozycjaY);
                   Controls.Add(box);
                   box.Image = Image.FromFile(okienkoWczytaniaPliku.FileName);
}

 
0

Mój poprzedni post jest niewidoczny? Co do twojego kodu, Top, Left == Location (X, Y), nie wiem czemu dajesz inne wartości tego. Tak jak mówiłem, zapisz sobie w zmiennej pozycję poprzedniego, jeżeli chcesz wyświetlać pod spodem to zapisz sam Top (Y) i dodaj wysokość obrazka poprzedniego + pustą odległość, to będzie nowa pozycja Y twojego PictureBox'a.

Masz kod:

public partial class Form1 : Form
    {
        int prevY, prevH;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            PictureBox PictureBox = new PictureBox();
            PictureBox.Location = new Point(10, prevY + prevH + 10); // to drugie '10' to odległość między PictureBox'ami
            PictureBox.Image = Image.FromFile("gola_baba.jpg");
            Controls.Add(PictureBox);
            // zapisanie poprzednich danych PictureBox'a (tego co stworzyliśmy):
            prevY = PictureBox.Location.Y;
            prevH = PictureBox.Image.Height;
        }
    }
0

Jeżeli celem jest umieszczanie kolejnych kontrolek jedna pod drugą (w sensie współrzędnych Y, a nie warstw), to proponuję zainteresować się kontenerem TableLayoutPanel, który potrafi rozmieszczać kontrolki automagicznie.

0

Oczywiście, ze widziałem posta... jeżeli chodzi o ten kontener to też może być jakieś rozwiązanie... natomiast ciąglę mi nie chce dodawać kolejnych wybranych plików po prostu ma mi dodawać pliki które ja wskarze po wciśnięciu klawisza pojawia się okno wyoru pliku dodaje ten plik później pod tym plikiem dodaję kolejny.... tak samo wciskając klawisz wyboru pliku...
int prevY, prevH;
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog okienkoWczytaniaPliku = new OpenFileDialog();
okienkoWczytaniaPliku.Filter = "Pliki graficzne (jpg)|.jpg|Pliki graficzne (bmp)|.bmp";

        if (okienkoWczytaniaPliku.ShowDialog() == DialogResult.OK)
        {
            PictureBox PictureBox = new PictureBox();
            PictureBox.Location = new Point(10, prevY + prevH + 10); // to drugie '10' to odległość między PictureBox'ami
            PictureBox.Image = Image.FromFile(okienkoWczytaniaPliku.FileName);
            Controls.Add(PictureBox);
            // zapisanie poprzednich danych PictureBox'a (tego co stworzyliśmy):
            prevY = PictureBox.Location.Y;
            prevH = PictureBox.Image.Height;
        }
    }
0

To nie wiem o co ci chodzi i co ci nie działa. Chcesz po kolei dodawać po jednym pliku (obrazku)? Czy od razu zaznaczyć kilka?

0

Tak dokładnie po kolei po jednym pliku dodawać... już to rozwiązałem zrobiłem tak jak pisałeś oddzielną klasę. Natomiast mam kolejne pytanie, jak zrobić żeby w labelu podawało mi tylko samą nazwę pliku (obrazka), który wczytam. Tutaj podaje mi całą ścieżkę wraz z nazwą.
Drugie pytanie jak zrobić już w programie głównym (drugi kod), żeby mi po naciśnięciu "anuluj" w tym okienku FileDialog wyłączało się Od razu bo teraz muszę nacisnąć przycisk 3 razy, jakbym miał więcej pictureboxów np. 5 to bym musiał 5 razy, a ja chcę tylko raz.

 class WczytanieObrazkow
    {

        PictureBox picTmp2;
        String nazwaZdjecia;
        Label labelPodpisZdjeciaTmp;
        //Label labelPodpisZdjecia;
    
        public WczytanieObrazkow(PictureBox picTmp2, Label labelPodpisZdjeciaTmp)
        {

          this.picTmp2 = picTmp2;
          this.labelPodpisZdjeciaTmp=labelPodpisZdjeciaTmp;
        }

        public void czyPictureBoxPusty(PictureBox picTmp, Label labelPodpisZdjecia)

        
        {
           OpenFileDialog okienkoWczytaniaPliku = new OpenFileDialog();
            okienkoWczytaniaPliku.Filter = "Pliki graficzne (jpg)|*.jpg|Pliki graficzne (bmp)|*.bmp";


            if (okienkoWczytaniaPliku.ShowDialog() == DialogResult.OK)
            {
                if (picTmp.Image == null)
                {
                    

                 picTmp.Image = Image.FromFile(okienkoWczytaniaPliku.FileName);

                   // MessageBox.Show("Wybrano plik: " + okienkoWczytaniaPliku.FileName);
                   nazwaZdjecia= okienkoWczytaniaPliku.FileName.ToString();
                  
                    //nazwaZdjecia = okienkoWczytaniaPliku..
                    
                   labelPodpisZdjecia.Text = nazwaZdjecia;
                    
                }
                else
                    MessageBox.Show("Nie można dodać więcej obrazków");
            }
               picTmp.SizeMode = PictureBoxSizeMode.StretchImage;
        }
 
 
private void button2_Click(object sender, EventArgs e)
       

       {
          
               WczytanieObrazkow tmpWczytanieObrazkow = new WczytanieObrazkow(pictureBox1, label1);
               tmpWczytanieObrazkow.czyPictureBoxPusty(pictureBox1, label1);


            
             WczytanieObrazkow tmpWczytanieObrazkow2 = new WczytanieObrazkow(pictureBox2, label2);
              tmpWczytanieObrazkow.czyPictureBoxPusty(pictureBox2, label2);



               WczytanieObrazkow tmpWczytanieObrazkow3 = new WczytanieObrazkow(pictureBox3, label3);
               tmpWczytanieObrazkow.czyPictureBoxPusty(pictureBox3, label3);
               //WczytanieObrazkow tmpWczytanieObrazkow4 = new WczytanieObrazkow(pictureBox4);
               // WczytanieObrazkow tmpWczytanieObrazkow5 = new WczytanieObrazkow(pictureBox5);
               // WczytanieObrazkow tmpWczytanieObrazkow6 = new WczytanieObrazkow(pictureBox6);
               // WczytanieObrazkow tmpWczytanieObrazkow7 = new WczytanieObrazkow(pictureBox7);
               // WczytanieObrazkow tmpWczytanieObrazkow8 = new WczytanieObrazkow(pictureBox8);



               
               //tmpWczytanieObrazkow.czyPictureBoxPusty(pictureBox4);
               // tmpWczytanieObrazkow.czyPictureBoxPusty(pictureBox5);
               //tmpWczytanieObrazkow.czyPictureBoxPusty(pictureBox6);
               //tmpWczytanieObrazkow.czyPictureBoxPusty(pictureBox7);
               // tmpWczytanieObrazkow.czyPictureBoxPusty(pictureBox8);
     }
0

I jeszcze jedno, jak zrobić, żeby jak kliknę na pciturebox1 to mi przeniesie (w sensie wrzuci też nie usuwająć z picturebox1) np. zdjęcie do picturebx2. Wiem, że picturebox ma zdarzenie doubleClick, ale jakoś nie mogę sobie poradzić z przeniesieniem tego zdjęcia.

0

Kopiowanie obrazka:
(BTW to są podstawy, naucz się ich, a dopiero coś klep) Po prostu w zdarzeniu jakie tam chcesz czy Click czy DoubleClick (podwójne) wstaw PictureBox2.Image = PictureBox1.Image; Zaraz resztę wymyślę i dokleję, tego co wcześniej chciałeś.

Sama nazwa pliku:

            OpenFileDialog.ShowDialog();
            MessageBox.Show(OpenFileDialog.FileName);
            string[] sciezka = OpenFileDialog.FileName.Split(new char[]{'\\'}); // dzielimy ścieżkę na poszczególne stringi oddzielone '\' (są 2, bo '\' jest znakiem zastrzeżonym, jeżeli kapujesz o co chodzi poczytaj o znakach specjalnych)
            MessageBox.Show(sciezka[sciezka.Length - 1]); // ostatni element tablicy jest nazwą pliku

Twojego drugiego pytania odnośnie działania przycisku "Anuluj" nie rozumiem, dokładniej opisz co chcesz uzyskać i jaki masz problem.

0

Odnośnie drugiego pytania chodzi o to, że mam tworzone w tym wypadku trzy obiekty "tmpWczytanieObrazkow" .... itd. I teraz tak Jak klikne przycisk button2 to okno wyboru pliku nie zamyka mi siępo wybraniu pliku, ale pojawia się jeszcze trzy razy (dla trzech obiektów tmpWczytanieObrazkow, tmpWczytanieObrazkow2, tmpWczytanieObrazkow3) , a ja chcę, żeby jak kliknę "button2" wybieram obrazek, i okno wyboru mi się zamyka dopiero jak kliknę drugi raz to pojawia mi się znowu okno wyboru pliku. Mam nadzieję, że jasno się wyraziłem.

0

Dzięki za podpowiedź, jak wyciagnać ostatni napis w sumie dodałem tylko dwie linijki i już mam w labelu to co chciałem

string[] sciezka = okienkoWczytaniaPliku.FileName.Split(new char[] { '\\' })
          
                   labelPodpisZdjecia.Text = sciezka[sciezka.Length - 1];
 

zostaje tylko ta kwestia, którą opisałem wyżej.

0

Chyba znalazłem powód, nie twórz oddzielnego OpenFileDialog'a, dla każdej instancji czy funkcji, już nie pamiętam co tam w kodzie miałeś, tylko miej jeden np. na formie, a jak nie to sobie stwórz globalny, a nie tworzysz na każdy obrazek następny OPD i wtedy też musisz jeszcze przerobić kod, aby jeden się wywoływał, ten globalny, powinno pomóc, jeżeli o to ci chodzi.

0

Hmm po wrzuceniu tylko na forme dalej nie idzie tak jak chciałem...
Masz rację OpenFileDialog jest tworzony dla każdej instancji obiektu, ale nie wiem jak sobie z tym poradzić, żeby zachować wynik działania tej metody...wrzucanie wszystkiego na Main nie ma sensu.
metoda z klasy WczytanieObrazków

 

class WczytanieObrazkow
    {

        PictureBox picTmp2;
        Label labelPodpisZdjeciaTmp;
        
        public WczytanieObrazkow(PictureBox picTmp2, Label labelPodpisZdjeciaTmp)
        {

          this.picTmp2 = picTmp2;
          this.labelPodpisZdjeciaTmp=labelPodpisZdjeciaTmp;
        }

 public void czyPictureBoxPusty(PictureBox picTmp, PictureBox picTmp2, PictureBox picTmp3, PictureBox picTmp4, Label labelPodpisZdjecia)
        
        {
         
                OpenFileDialog okienkoWczytaniaPliku = new OpenFileDialog();
                okienkoWczytaniaPliku.Filter = "Pliki graficzne (jpg)|*.jpg|Pliki graficzne (bmp)|*.bmp";


                if (okienkoWczytaniaPliku.ShowDialog() == DialogResult.OK)
                {
                      if (picTmp.Image == null) 
                    {
                        picTmp.Image = Image.FromFile(okienkoWczytaniaPliku.FileName);
                    
                        string[] sciezka = okienkoWczytaniaPliku.FileName.Split(new char[] { '\\' }); 
                        labelPodpisZdjecia.Text = sciezka[sciezka.Length - 1];


                    }
                    else
                        MessageBox.Show("Nie można dodać więcej obrazków");
                }
            

                picTmp.SizeMode = PictureBoxSizeMode.StretchImage;
    
        
         

        }
}

A tutaj tworzenie obiektów na formie

 
 private void button2_Click(object sender, EventArgs e)
       

       {
          
               WczytanieObrazkow tmpWczytanieObrazkow = new WczytanieObrazkow(pictureBox1, label1);
               tmpWczytanieObrazkow.czyPictureBoxPusty(pictureBox1,pictureBox2,pictureBox3,pictureBox9, label1);
              

            
             WczytanieObrazkow tmpWczytanieObrazkow2 = new WczytanieObrazkow(pictureBox2, label2);
             tmpWczytanieObrazkow.czyPictureBoxPusty(pictureBox2, pictureBox3, pictureBox9, pictureBox1, label2);



               WczytanieObrazkow tmpWczytanieObrazkow3 = new WczytanieObrazkow(pictureBox3, label3);
               tmpWczytanieObrazkow.czyPictureBoxPusty(pictureBox3, pictureBox9, pictureBox2, pictureBox1, label3);
               WczytanieObrazkow tmpWczytanieObrazkow4 = new WczytanieObrazkow(pictureBox9, label4);
               tmpWczytanieObrazkow.czyPictureBoxPusty(pictureBox9, pictureBox3, pictureBox2, pictureBox1, label4);

}

0

To jeszcze raz. Jaki problem masz teraz? Wynik której metody chcesz zachować, i może powiedz dokładnie jaki chcesz uzyskać efekt twojego programu, to Ci napiszę dobry kod. Miło by było, jak wstawiasz kod, to żebyś wstawiał go z formatowaniem dla danego języka w tym wypadku C#

0

Więc tak klikam przycisk "button2" otwiera się okno wyboru plików graficznych... wybieram dany plik, metoda sprawdza czy któryś z 4 pictureboxów jest pusty, jeśli jest to wstawia do peirwszego, który jest pusty, jeśli nie to wyświetla komunikat, że nie można dodać więcej pictureboxów. Z tym, że jeśli wcisne "button2" to żeby po wybraniu pliku okieno się zamknęło (czyli dodaje tylko jeden plik) i dopiero gdy wcisne drugi raz"button2" dodaje sobie drugi plik itd. W moim wypadku mam tak, że Od razu 4 razy pojawia mi się okienko wyboru pliku. dla 4 pictureboxów.

0

Dzieje się tak, ponieważ masz 4 metody sprawdzania i wrzucania do pierwszego pustego, a w nich tworzysz każdy oddzielny dialog. Zrób tak: Daj jedną metodę, która sprawdza PictureBox'y i dopiero tworzy dialog, czyli:

public void czyPictureBoxPusty(ref PictureBox picTmp, ref PictureBox picTmp2, ref PictureBox picTmp3, ref PictureBox picTmp4, Label labelPodpisZdjecia)
        {
            PictureBox wolny = null;

            if (picTmp4.Image != null)
                wolny = picTmp4;

            if (picTmp3.Image != null)
                wolny = picTmp3;

            if (picTmp2.Image != null)
                wolny = picTmp2;

            if (picTmp.Image != null)
                wolny = picTmp;

            if (wolny == null)
                MessageBox.Show("Nie można dodać więcej obrazków");
            else
            {
                OpenFileDialog OPD = new OpenFileDialog();
                OPD.Filter = "Pliki graficzne (jpg)|*.jpg|Pliki graficzne (bmp)|*.bmp";
                wolny.Image = Image.FromFile(OPD.FileName);

                string[] sciezka = OPD.FileName.Split(new char[] { '\\' });
                labelPodpisZdjecia.Text = sciezka[sciezka.Length - 1];
            }

            wolny.SizeMode = PictureBoxSizeMode.StretchImage;

Powinno działać. Sprawdzam od końca, by mieć pierwszy wolny, a potem, gdy jakiś jest pusty daję wolny = ten pusty. Następnie wywołuję OPD i dodaję do PictureBox'a.

0

hmm.. no jest to na rzeczy, ale wyswietla mi teraz cały czas "nie mozna dodac wiecej obrazkow"...

0

To widocznie jak nie ma wczytanego obrazka wartość Image nie jest null ;/ Poszukaj w necie jak wykryć czy jest wczytany obrazek czy nie i wstaw zamiast tego warunku inny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1