Pictureboxen in FlowLayoutpanel

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    Pictureboxen in FlowLayoutpanel

    Guten Morgen zusammen!

    Ich beschäftige mich seit gestern mit folgender Problemstellung:

    Im appPath gibt es einen Ordner, der Bilder enthält. Ab und zu werden Bilder hinzugefügt. Eine Form greift auf diesen Ordner zu und soll ALLE Bilder in Pictureboxen in einem FlowLayoutPanel anzeigen. Da der Ordner mit Bildern ständig wächst, möchte ich also automatisch jedem Bild eine Variable zuweisen und eine Picturebox im FlowLayoutPanel erstellen.

    Ist das irgendwie zu realisieren? Bin für jeden Denkanstoß dankbar!

    Im Moment habe ich es so, dass ich z.B 12 Pictureboxen im FlowLayoutPanel habe. Der o.g. Bilderordner wird nach Dateien durchsucht und die Pictureboxen verwenden den jeweiligen Index der Dateien als Pfad.
    Aber wie gesagt der Ordner wächst und es wäre natürlich sehr umständlich, jedes Mal die Anzahl der Pictureboxen händisch zu erhöhen......

    Vielen Dank und ein schönes Wochenende!
    Am einfachsten wäre es wohl, wenn Du einen FileSystemWatcher verwendest, der das Verzeichnis im Auge behält und jedes mal, wenn eine Datei hinzukommt, mittels seinem passenden EventHandler eine neue PicBox erstellt. Letzteres durch

    VB.NET-Quellcode

    1. Dim NewPicBox As New PictureBox
    2. 'hier die ganzen PicBox-Daten einstellen
    3. DeinFlowLayoutPanel.Controls.Add(NewPicBox)

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @VaporiZed Jou.
    @iOS78 Wenn die Bilder größer sind, solltest Du das Bild pixelmäßig verkleinern, da sonst eine OutOfMemory-Exception kommt.
    Falls Du beabsichtigst, Bilder wieder löschen zu wollen, musst Du .Image.Dispose() aufrufen, um die Ressourcen wieder freizugeben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    iOS78 schrieb:

    15-20 Bilddateien
    Dein Programm sollte da festgelegt sein.
    Gib also dem FileSystemWatcher zwei Events: Neue Datei und Datei gelöscht.
    Mach Dir ein UserControl mit ner PictureBox und ner Dateipfad-Property, einer Boolean Kill-Function mit Pfad-Parameter, dann wird das Hinzufügen eines Bildes zum Einzeiler:

    VB.NET-Quellcode

    1. MyPanel.Add(New MyUserControl(PfadZurDatei))
    Beim Löschen musst Du dann nur noch alle MyUserControl-Instanzen per Kill-Function durchklickern und bei Antwort True diese Instanz löschen.
    Alternativ wäre die Verwendung eines Dictionary(Of String, MyUserControl), da kannste die Löschung per Key-Zugriff organisieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    iOS78 schrieb:

    Ja, entfernen könnte vorkommen!
    Dann mach mal einen detaillierten Plan.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hi!
    Bin das ganze WE nicht am Rechner und kann dementsprechend auch nichts probieren.

    Mal zum Ablauf:

    Geplant ist, Aufnahmen von einem Mikroskop, die aus einer externen Anwendung stammen, zu archivieren, und bei. Bedarf in einem FLP darzustellen.
    Da nie bekannt sein wird, wieviele Aufnahmen pro Tag gemacht werden, möchte ich die o.g. Vorgehensweise anwenden.
    Was ich bereits gemacht habe:
    - die Aufnahmen des Mikroskops werden von meiner Anwendung aus dem Dateipfad der externen Anwendung „abgeholt“ und in einem separaten Ordner abgelegt (Ordnername=Datum).
    Wenn in meiner Anwendung nun dieser Ordner geöffnet wird, soll o.g. FLP erscheinen und alle Bilder anzeigen, die zu besagten Datum gehören.

    Dateien zu löschen, soll nicht die Regel, aber möglich sein.


    ich hoffe, ich könnte mein Vorhanen halbwegs deutlich rüberbringen?!
    Jo, also zum Darstellen vieler Bilder hab ich hier mal eine höchst einfache Listview-Modifikation eingestellt: ImageListView
    Die Darstellungs-Größe der Bilder ist allerdings begrenzt - aber immer noch groß genug, um bequem eines auszuwählen (welches man dann etwa als Einzelbild auf einer wirklich grossen Picturebox anzeigen kann.
    @iOS78 Oder ganz anders:
    Du machst aus dem aktuellen Bild eine MyUserControl-Instanz, die intern ein "Thumbnail" hält und zeigst dieses an (abhängig von der tatsächlichen Bildgröße, die da wie wäre :?: ).
    Bei einem Klick drauf wird eine neue Großbild-Instanz erzeugt und separat angezeigt.
    Ich hab mal ein Foto-Sortier-Programm gemacht, das geht sehr fix.
    Mit nem Kontextmenü auf dem Thumbnail kannst Du dann organisieren, was zu organisieren ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich habe mal was ähnliche rausgekramt.



    VB.NET-Quellcode

    1. Private Sub ListViewDBImageView_DrawItem(ByVal sender As Object, ByVal e As DrawListViewItemEventArgs) Handles ListViewDBImageView.DrawItem
    2. Dim item As ImageListViewItem = DirectCast(e.Item, ImageListViewItem)
    3. Dim imageWidth As Integer = Math.Min(256, item.Bitmap.Width)
    4. Dim imageHeight As Integer = Math.Min(256, item.Bitmap.Height)
    5. e.Graphics.CompositingQuality = CompositingQuality.HighQuality
    6. e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality
    7. e.Graphics.SmoothingMode = SmoothingMode.HighQuality
    8. e.Graphics.Clip = New Region(e.Bounds)
    9. ' Background
    10. Dim backgroundBrush As New SolidBrush(SystemColors.Window)
    11. e.Graphics.FillRectangle(backgroundBrush,
    12. New Rectangle(e.Bounds.X,
    13. e.Bounds.Y,
    14. e.Bounds.Width,
    15. e.Bounds.Height))
    16. ' Image
    17. e.Graphics.DrawImage(item.Bitmap,
    18. New Rectangle(e.Bounds.X + (e.Bounds.Width - imageWidth) \ 2,
    19. e.Bounds.Y + (e.Bounds.Height - imageHeight) \ 2,
    20. imageWidth,
    21. imageHeight),
    22. New Rectangle(Point.Empty, item.Bitmap.Size),
    23. GraphicsUnit.Pixel)
    24. ' Footer Background
    25. Dim footerBackgroundBrush As New SolidBrush(Color.FromArgb(200, 0, 0, 0))
    26. e.Graphics.FillRectangle(footerBackgroundBrush,
    27. New Rectangle(e.Bounds.X,
    28. e.Bounds.Y + e.Bounds.Height - 20,
    29. e.Bounds.Width,
    30. 20))
    31. ' Footer Text
    32. TextRenderer.DrawText(e.Graphics,
    33. item.Tag.ToString,
    34. Font,
    35. New Rectangle(e.Bounds.Left,
    36. e.Bounds.Bottom - Font.Height - 4,
    37. e.Bounds.Width,
    38. Font.Height),
    39. Color.White)
    40. ' Border
    41. Dim brush As New SolidBrush(SystemColors.ControlLight)
    42. If e.Item.Selected Then brush = New SolidBrush(SystemColors.MenuHighlight)
    43. Dim pen As New Pen(brush, 4)
    44. e.Graphics.DrawRectangle(pen, e.Bounds)
    45. '
    46. SetStatusLabel()
    47. End Sub

    Wenn man die ListViewItems selbst zeichnet, hat man einfach mehr Gestalltungsmöglichkeiten.
    Ich habe eine TestApp drumherum gabastelt, kannste dir ja mal angucken und mit rumexperementieren.
    Dateien