2017-03-23 6 views
-2

Ich schreibe ein Programm, das Bilddateien zur Laufzeit erstellt und lädt. Das Problem ist, dass sie nicht angezeigt oder angezeigt werden. Nicht sicher, was ich falsch mache. Ich habe überprüft und der vollständige Pfad für die Bilder ist korrekt.Picturebox zeigt kein Bild an

Sub DrawScreen() 
    'Call g.DrawImage to draw whatever you want in here 
    Dim layers(Me.ListBox1.Items.Count) As PictureBox 

    For i = 0 To ListBox1.Items.Count - 1 
     'Create New Layer as picturebox 
     layers(i) = New PictureBox 
     layers(i).Parent = Me.picWatch 
     layers(i).BackColor = Color.Transparent 
     layers(i).Visible = True 

     Select Case ListBox1.Items(i) 

      Case "image" 
       'Debug.Print(ListofLayers(i).Full_Path) 
       layers(i).Image = Image.FromFile(ListofLayers(i).Full_Path) 
       layers(i).Top = ListofLayers(i).X 
       picWatch.Controls.Add(layers(i)) 

      Case "shape" 
       'Dim g As Graphics 
       'g.DrawRectangle() 

      Case "text" 
       Dim g As Graphics = layers(i).CreateGraphics 
       g.DrawString(ListofLayers(i).Text, New Font("Arial", 12), Brushes.White, ListofLayers(i).X, ListofLayers(i).Y) 

      Case Else 
       Debug.Print(ListBox1.Items(i)) 

     End Select 
    Next 
    Me.Refresh() 
End Sub 
+1

'Schichten (i) .Top = ListofLayers (i) .X' ? X ist normalerweise linke oder rechte Position. Verwenden Sie nicht CreateGraphics. Verwenden Sie das Paint-Ereignis des Steuerelements. – LarsTech

+0

Ich habe gerade bemerkt, was ist 'PicWatch' und wo ist es? –

+0

@VisualVincent müsste es nicht ein Container irgendeiner Art sein, wie ein "Panel"? Es scheint die wahrscheinlichste Möglichkeit zu sein. –

Antwort

2

Sie fügen die Bildfelder niemals dem Formular hinzu. Rufen Sie Me.Controls.Add():

Me.Controls.Add(layers(i)) 

Und wie bereits darauf hingewiesen, durch LarsTech:

  1. Sie scheinen hier einen Tippfehler zu haben:

    layers(i).Top = ListofLayers(i).X 
    

    X die Koordinate für die horizontale Position des Steuer- und ist das gleiche wie .Left.

    Y ist jedoch die Koordinate für die vertikale Position des Steuerelements, die der .Top entspricht.

  2. Verwenden CreateGraphics ist eine schlechte Idee. Für den Anfang wird das, was du damit zeichnest, entfernt, wenn das Steuerelement neu gezeichnet wird. Und da du es nicht entsorgst, wirst du auch Speicherlecks haben.

    Abonnieren Sie die Paint event für jede Bildbox statt und tun Sie alle Zeichnung dort.

schließlich nur eine kleine Anmerkung: Array Erklärungen in VB.NET sind nicht festgelegt, wie viele Artikel gibt es in der Reihe sein, aber zu welchem ​​Index des Array an enden soll. Und da Arrays Null-basieren, dies:

Dim layers(Me.ListBox1.Items.Count) As PictureBox 

... gleich dies:

Dim layers(0 To Me.ListBox1.Items.Count) As PictureBox 

So ist die Array ListBox1.Items.Countenthalten plus ein da das, was in den Klammern ist nur Geben Sie die untere und/oder obere Grenze an.

Um ein Array mit der "richtigen" Menge von Elementen erstellen Sie immer die Größe minus ein angeben sollten:

Dim layers(Me.ListBox1.Items.Count - 1) As PictureBox 
+0

sie werden während der Select-Case-Anweisung hinzugefügt – RedWiz666

+0

Ja, das habe ich später gesehen. –

+0

Können Sie das Paint-Ereignis mit einem Array verwenden? Würde ich auch nur eines der Bilder auswählen und verschieben können? Stellen Sie zum Beispiel das x oder y ein. Angenommen, ich könnte das Bild mit den neuen Einstellungen einfach neu zeichnen, aber ich bin mir nicht sicher, wie ich es auswählen und nur dieses verschieben würde, ohne alle Bilder neu zeichnen zu müssen. – RedWiz666