[C#]Array van picturebox en transparante labels

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 13-09 21:05
ik wil een array van pictureboxen maken met daarbovenop labels om te tekst transparant te laten zijn. Het lukt mij, bij wijze van test, als ik een label en een picturebox zelf op een form zet. Ik gebruik deze code:

code:
1
2
3
4
5
6
        private void Form2_Load(object sender, EventArgs e)
        {
            label1.BackColor = Color.Transparent;
            label1.Parent = pictureBox1 ;
            label1.Location = pictureBox1.PointToClient(this.PointToScreen(label1.Location));
        }


ok, nu wil ik een array van pictureboxen met daarbovenop wederom de labels. de aantallen worden dynamisch bepaald. De code om een array van objecten op het scherm te zetten gaat op zich goed, maar ik krijg, middels onderstaande code de labels niet zichtbaar. Als ik b.visible = false toevoeg, zie ik ze wel. Ook geforceerd op de voorgrond zetten heeft geen resultaat. Het is ongetwijfeld iets kleins, maar ik zie niet wat ik fout doe.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    for (int rows = 0; rows < iRows; rows++)
                {

                    for (int cols = 0; cols < iCols; cols++)
                    {
                        counter++;


                        PictureBox b = new PictureBox();
                        Label lb = new Label();

                        b.Height = iKnopHoogte;
                        b.Width = iKnopBreedte;
                        b.Name = "Button" + counter;
                        b.Click += new EventHandler(ButtonClicks);
                        b.Top = (rows) * iKnopHoogte;
                        b.Left = (cols) * iKnopBreedte;
                        b.Font = new Font("verdana", 12, FontStyle.Bold);
                        b.Image = picRood.Image;
                        b.Tag="Naam\n" + Convert.ToString(counter);
                        b.SizeMode = PictureBoxSizeMode.StretchImage;
                      // b.Visible = false;
                        this.Controls.Add(b);
                        
                        lb.TextAlign = ContentAlignment.MiddleCenter;
                        lb.Name = "label" + counter;
                        lb.Text = counter.ToString();
                        lb.BackColor =  Color.Transparent;
                        lb.Font =  new Font("verdana", 12, FontStyle.Bold);
                        lb.Parent = b;
                        lb.Height = b.Height;
                        lb.Width = b.Width;
                        //lb.Location = new Point((cols) * iKnopBreedte, (rows) * iKnopHoogte);    // b.PointToClient(this.PointToScreen(lb.Location));
                        //lb.BringToFront();
                        lb.Location = b.PointToClient(this.PointToScreen(lb.Location));
                        this.Controls.Add(lb);

                        //b.Visible = true ;
                        //b.BringToFront();
                       // 
                    }
                  
                }

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Twee dingen:

1. Wat wil je bereiken met je PointToClient en dan PointToScreen aanroepen (regel 35)? Als je de PictureBox de parent maakt van de Label dan zou de Location van de label relatief t.o.v. de PictureBox moeten zijn. Wil je de label dus 20 pixels van de top en 15 pixels van de left van de PictureBox dan zet je de location gewoon op (15, 20).

2. Maak ofwel een UserControl waar je de PictureBox en Label op zet, en voeg dan dynamisch instanties van deze UserControl toe. Mocht je de PictureBox of Label verder nodig hebben, maak dan twee properties in je UserControl die de PictureBox en Label terugkeren.
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
Public Partial Class LabelPictureBox
   
   Public ReadOnly Property PictureBox() As PictureBox
      Get
         Return Me.pictureBox1
      End Get
   End Property
 
   'zelfde voor label
End Class

Nog beter is het om alleen de properties die je nodig hebt (zeg, de Text van de Label en de Image van de PictureBox) op deze manier zichtbaar te maken, maar als er dat veel worden is het makkelijker om gewoon de hele controls door te sturen.

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 13-09 21:05
Het probleem zit niet in de locatie van het label , maar hij staat niet op de voorgrond (BringToFront heb ik ook al geprobeerd). Het eerste voorbeeld werkt wel goed. Nu wil ik dezelfde situatie, maar dan dynamisch bepaald. als ik de picturebox invisible maak, zie ik wel de labels, ook op de juiste locatie

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Ik denk dat het probleem is dat je op het eind de label nog eens aan de Form.Controls collectie toevoegt, dat zal de parent weer terugzetten naar de Form en niet de PictureBox.

Ik raad je toch nog steeds aan om een UserControl te gebruiken, die zijn specifiek bedacht om meerdere controls als een enkel geheel te gebruiken, precies wat jij wil bereiken.

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 13-09 21:05
ik had gehoopt het op deze manier op te lossen, maar als het niet anders kan zal ik een UserControl moeten gaan maken. Ik zal mezelf er eens in verdiepen

als er nog andere tips zijn hoor ik het graag

Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
Kun je niet gewoon doen: b.Controls.Add(lb)?

Acties:
  • 0 Henk 'm!

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 13-09 21:05
dan krijg ik wel wel zoals ik het hebben wil, echter alleen voor de eerste picturebox, niet de overige aantallan

Acties:
  • 0 Henk 'm!

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 13-09 21:05
ik ben nu zover dat ik een usercontrol heb gemaakt zoals het bedoeld was (stelt niet veel voor om dit te doen...). Nu wil ik deze in een 2D array hebben zoals ik de openingspost de pictureboxen zijn gemaakt, maar dit wil niet lukken.

hoe kan ik een 2D array maken van mijn UC ?

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
In plaats van
C#:
1
2
PictureBox b = new PictureBox();
Label lb = new Label();

gebruik je gewoon
C#:
1
PictureBoxLabel p = new PictureBoxLabel();

aangenomen dat je je UserControl 'PictureBoxLabel' hebt genoemd. Precies hetzelfde dus. Een UserControl is net zo veel een control als een picturebox of label dat is, en het maken, positioneren en aan de Controls collectie toevoegen veranderd dus niet.

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 13-09 21:05
en verschrikkelijk bedankt ! het werkt zoals het zou moeten werken nu kan ik weer verder ;)
Pagina: 1