Picturebox vor Flowlayoutpanel

  • VB.NET

Es gibt 185 Antworten in diesem Thema. Der letzte Beitrag () ist von Schmandal.

    Picturebox vor Flowlayoutpanel

    Guten Morgen zusammen,


    gibt es eine Möglichkeit eine Picturebox zur Laufzeit über ein FlowLayouPanel zu legen (transparent).

    Ich habe nun diverse Sachen getestet aber ich bekomme es einfach nicht hin. Ich habe die Picturebox mit BringToFront erstellt. Erzielte keine Wirkung. Die Z-Order per Code zu ändern hat mir auch nicht geholfen oder ich habe es falsch gemacht. Einzig und allein, wenn ich das Panel mit SendToBack in den Hintergrundstelle funktioniert es. Jedoch fehlen mir dann natürlich das Panel mit Inhalt, da es hinter einen anderen Picturebox verschwindet.

    Würde mich über einen Tipp freuen. Vielen Dank!

    Schmandal schrieb:

    Picturebox
    Welchem Parent-Control gehören denn Picturebox und Flowlayoutpanel an?
    Gugst Du in der Prozedur InitializeComponents(), wessen Control-Collection sie zugewiesen werden.
    Poste ggf. den ganzen Code: FormX.vb, FormX.Designer.vb.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    Erzähl mal bischen ausführlicher, was du machen willst, und welchen Sinn das haben soll.


    Hmm, ErfinderdesRates, wäre auch ein passender Nick gewesen ;).

    Nunja, ich habe ein Spielbrett, mit jeweils 6 Reihen untereinander in denen jeweils Karten abgelegt werden. In jede Reihe gehören bestimmte Karten. Nun gibt es zum Beispiel eine Spezial-Karte, die eine Reihe "brennen" lässt, sprich der Wert der Karten in dieser Reihe werden herabgesetzt. Um diesen wunderschönen Effekt auch stilsicher auf dieser Reihe zu drapieren, würde ich gerne eine Feuer-Grafik über die Karten legen.

    Reicht das als Info. Ich erzähle auch gerne mehr, will dich allerdings nicht mit sinnlosem Ballast zuschreiben :)
    nee - ausgezeichnete Beschreibung!
    Du glaubst garnet, wie schwer sich Progger gewöhnlich damit tun, ihre Absicht zu beschreiben - die verzetteln die sich immer in Pictureboxen, Textboxen, Events und wasses alles gibt. Also ich krieg auf die Frage ganz oft ausführliche Beschreibungen der mutmasslichen Mittel, aber das Ziel wird dabei kaum klarer (und die angedachten Mittel mögen ja höchst ungeeignet sein).

    Also beim OwnerDrawing hättest du eine Figur-Klasse, die sich selbst zeichnet.
    Die könnte eine Boolean Property Brennt haben, und dann zeichnet sie nicht nur ihre Karten-Bitmap, sondern auch eine (allgemeine) Feuer-Bitmap darüber.

    Das ist eine der Stärken von OwnerDrawing, dass sich die Figur-Klassen beliebig erweitern lassen. Wenn man statt Figur-Klassen mit Pictureboxen arbeitet, muss man da ziemlich rumhampeln, um die PBs iwie mit den Zusatz-Daten zu verknüpfen.

    Aber OwnerDrawing setzt OOP-Programmier-Fähigkeit vorraus, also Klassen inklusive Vererbung, Methoden, Events sollteman implementieren können.
    Und dann muss man auch noch das Denken umdrehen, beim OwnerDrawing gibts kein Bild mehr, sondern eben derlei Figur-Klassen, die die Zeichnungs-Informationen beinhalten. Die also jederzeit ein Bild zeichnen können, aber nicht eigentlich ein Bild enthalten.

    guggemol activevb.de/cgi-bin/tippupload…ype=net&id=18&sid=0%0D%0A
    Deine Karten werden ganz anders ticken, drehen brauchen die sich ja nicht, aber das Draggen mitte Maus könnte für dich auch interessant sein. Damit kriegst du auch Überlappende Darstellung hin - ah - hier habich was vlt. passenderes:
    StoryCards - verschiebbare Zeichenobjekte
    Eieiei. Vielen Dank für deine Antwort :(. Nun bin ich doch nahezu bis auf mein kleines KI-Problem mit dem Projekt fertig geworden und nun gibts Du mir einen Tipp, den ich gerne umsetzen würde. Das heißt ich fange nochmal von vorn an oder? Ich habe zwar die Karten in Pictureboxen und hatte mich gerade mit dem FlowLayoutPaneldingen angefreundet, jedoch ist die andere Lösung doch schöner. Wie in den anderen Threads ersichtlich habe ich sonst auf Pictureboxen gemalt :).

    Ich habe mir das Projekt runtergeladen und auch den ersten TIPP angeschaut. Dennoch würde ich dich bitten, wenn es deine Zeit erlaubt, mir evtl. den Einstieg ein wenig zu erleichtern.

    Kannst Du mir verraten, wie ich eine Figur zeichne mit Kartenbild (aus dem Netz oder lokal) und ob ich diese dann wieder selbst mit einer Klasse an die Orte zaubern muss, oder kann ich mir dann eine Art FlowLayouPanel zur optimalen Anordnung selbst basteln?

    Leider habe ich nur viele Beispiele auf Anhieb für diverse Listviews oder Tooltips gefunden.

    Ein einfaches Bild zu zeichnen, scheint mir gerade unlösbar.
    aber das ist im Projekt doch gezeigt.

    naja, nun grad nicht mit Bitmaps, also statt e.Graphics.DrawPath(...) musste halt hinschreiben e.Graphics.DrawImage(...).
    Guck dir die Graphics-Klasse auch im ObjectBrowser an - die bietet im wesentlichen alle Zeichen-Möglichkeiten.

    ObjectBrowser kennste? sonst VisualStudio richtig nutzen
    Ah, alles klar danke. Nun haben wir gerade aneinander vorbei geredet glaube ich und meine Grammatik laggt.

    Ich glaube ich komme einfach mit diesen Grafik-Ausdrücken "noch" nicht klar. GDI, GDI+, OwnerDrawing, ZwackZingBims (obwohl ja gleich?) und haste nicht gesehen. Ich habe wenig mit Animationen und Zeichnen zu tun gehabt. Außer ein bisschen DirectX bin ich da noch recht neu.

    Nun entschuldige bitte meine Frage und nicht anschreien gell :) Was ist des hier nun genau für eine Methode?

    VB.NET-Quellcode

    1. Private Sub DPAint(sender As Object, e As PaintEventArgs)
    2. Dim stringFormat As New StringFormat()
    3. stringFormat.Alignment = StringAlignment.Center
    4. stringFormat.LineAlignment = StringAlignment.Center
    5. Dim rect1 As New Rectangle(10, 10, 732, 160)
    6. e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
    7. e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit
    8. e.Graphics.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
    9. e.Graphics.DrawString(boardingtext, New Font("Arial", 24, FontStyle.Bold), Brushes.FloralWhite, rect1, stringFormat)
    10. End Sub


    Ich gelobe Besserung... eines schönen Tages.
    Das ist eine Paint-Methode.
    Sie painted eine String, in zeile#11.

    Von der Signatur her ("Signatur": Grundlagen: Fachbegriffe) ist die Methode geeignet, das Paint-Event eines beliebigen Controls zu empfangen.

    Der Text wird zentriert geschrieben ins Rechteck 10, 10, 732, 160

    Aber warum beschäftigst du dich mit Schnipseln, zu denen du kein lauffähiges Projekt hast, anstatt die Projekte anzugucken, die ich dir verlinkt habe?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    Beantworte du mir erst meine Frage aus post#9


    Entschuldige bitte, ich habe den Post gar nicht gesehen :(. Naja der Schnipsel ist aus meinem Projekt. Ich habe die Anzeigen und kleinen Grafiken mit der Paint-Methode gezeichnet. Und da ich wirklich nicht verstanden hatte, welche Unterschiede die ganzen Grafik-Methoden aufweisen, wollte ich nur sicher gehen, dass das nicht auch falsch ist.
    Inhaltlich ist die Methode ok - bis auf die Kleinigkeit, dass in jedem Aufruf ein neues StringFormat erzeugt wird. Stringformat ist IDisposabel, also entweder solltest du nur ein einziges erzeugen, und immer wiederverwenden, oder du musst es jedesmal disposen.
    Ich bin für ersteres, denn Paint-Methoden sollten möglichst schnell sein.
    Dasselbe gilt noch mehr für den Font. Font ist eine ziemlich fette Struktur.

    Nicht erkennen kann ich, ob dieser Eventhandler überhaupt ein Event empfängt.

    VB.NET-Quellcode

    1. Public Function infoboarding(Optional infotext As String = "", Optional ccode As Integer = 1)
    2. Dim infoboard As New PictureBox
    3. With infoboard
    4. .Name = "infoboarding"
    5. .Width = 732
    6. .Height = 160
    7. .Top = 200
    8. .SizeMode = PictureBoxSizeMode.StretchImage
    9. .Visible = True
    10. .BackColor = Color.Transparent
    11. .ImageLocation = sAppPath & "\gui\infotafel.png"
    12. .WaitOnLoad = True
    13. End With
    14. AddHandler infoboard.Paint, AddressOf MPaint
    15. Controls.Add(infoboard)
    16. Do While game.inforunner.Enabled = True
    17. Application.DoEvents()
    18. Loop
    19. infoboard.Dispose()


    Das war meine erste Lösung dazu. Ich habe eine PB (in einer MDI) genommen und habe diese als Infofenster mißbraucht. Dort lasse ich einfach alle Texte und Infos anzeigen (Wer ist dran, Specials, Karten ziehen etc. pp).
    ah, ok. nun Frage: Was bezweckt diese Endlosschleife?

    VB.NET-Quellcode

    1. Do While game.inforunner.Enabled = True
    2. Application.DoEvents()
    3. Loop


    ah - schon verstanden: infoboard.Dispose() soll nicht erreicht werden.
    Aber dann lösch doch einfach die zeilen #19 - #23 - damit erreichst du dasselbe Ziel, und sparst jede Menge Rechner-Resourcen.

    Noch weiter gedacht könnte die ganze Methode weg - eine Picturebox kannst du besser im Form-Designer aufs Form machen, inklusive aller Einstellungen, die dein Code zeigt.