Picturebox vor Flowlayoutpanel
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 185 Antworten in diesem Thema. Der letzte Beitrag () ist von Schmandal.
-
-
ErfinderDesRades schrieb:
du könntest auch einfach Picturebox.Show/.Hide machen.
Ja, klar. Manchmal denke ich vllt. ein bisschen anders/zu kompliziert. Um nochmal auf den Ursprung zurückzukommen. Ist es sinnvoller diese Sachen alle mit OwnerDrawing zu ändern oder ist das so in Ordnung? -
-
Das alles war auf meine vorher genannte Paint Methode bezogen. Wenn ich Deine und Rods Beiträge richtig verstanden habe, ist die Paint Methode wohl nicht die beste Lösung sowas zu realisieren. Ich werde mir die Projekte nochmals genauer anschauen und dann versuchen die Karten aus den Pictureboxen zu entfernen und es komplett mit Ownerdrawing zu erledigen. Ich bin mir trotzdem noch unsicher wegen der vielen verschiedenen Lösungswege, aber vllt. erkenne ich dann ja das Positive daran (Owner Drawing / Ownerdrawing)
-
Schmandal schrieb:
Wenn ich Deine und Rods Beiträge richtig verstanden habe, ist die Paint Methode wohl nicht die beste Lösung sowas zu realisieren.
Die Paint-Methode - also die Behandlung des Paint-Events ist der Kern des OwnerDrawing-Ansatzes.
Und den OwnderDrawing-Ansatz halte ich für den besten.
Ist zunächstmal anspruchsvoller zu programmieren, aber das naive "picturebox hinmachen, picturebox wegmachen" zieht allerlei Folge-Probleme nach sich, die sich bei OwnerDrawing fast von selbst auflösen.
Und somit ist OwnDrawing letztendlich auch garnet schwieriger als "picturebox hinmachen, picturebox wegmachen". -
ErfinderDesRades schrieb:
Versteh ich nicht.
Ach komm, hör doch nicht auf den Mist den ich schreibe ;). Ich komme, wie eingangs erwähnt, nicht mit den verschiedenen Begriffen klar, was Grafiken und Zeichnen betrifft. Bis auf die Karten nutze ich schon die Paint Methode. Habe für die Zählung der Punkte auch eine Klasse geschrieben, die rechnet und sich mit dem Server austauscht. Prüfe bei jedem Zug natürlich auf dem Server ob er machbar ist, und rechne auch noch in VB und vergleiche. Die Punkte in Ihren formschönen Kreisen zeichne ich dann auf das Brettchen. -
Schmandal schrieb:
Bis auf die Karten nutze ich schon die Paint Methode.
Löse das objektorientiert:
Mach Dir eine Karten-Klasse, wenn Du sie nicht schon hast. Gib dieser Klasse eine Paint-Prozedur, die nix anderes tut, als sich selbst zu zeichnen. Erforderliche Informationen wäen da nur die Karte selbst, also Farbe und Wert (Pik-Dame oder Schell-Lusche) und die Position. Male z.B. ein Bitmap-Objekt an die entsprechende Position.
Im Paint-Event des übergeordneten Fensters rufst Du einfach die Paint-Routine der vorhandenen und darzustellenden Karten-Instanzen auf und feddich.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! -
Also ich bin mir ein wenig unsicher, ob ich das ganze richtig angehe. Ich habe wie gesagt, ein Spielbrett und untereinander die 6 Reihen, in die die Karten gelegt werden. Die meisten Karten hole ich vom Server ab und packe sie in eine Liste.
Jetzt habe ich noch folgendes gemacht:
VB.NET-Quellcode
- Option Strict On
- Public Class Cards
- Public Property Image As Image
- Public Property x As Integer
- Public Property y As Integer
- Public Property cardname As String
- Public Function PaintCard(cname As String, xcoord As Integer, ycoord As Integer) As Boolean
- AddHandler game.brett.Paint, AddressOf DrawMe
- x = xcoord
- y = ycoord
- cardname = cname
- For Each muh In game.MImages
- If muh.Name & ".png" = cname Then
- Image = muh.Image
- Else
- End If
- Next
- game.brett.Invalidate()
- Return True
- End Function
- Public Sub DrawMe(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
- e.Graphics.DrawImage(Image, x, y, 100, 100)
- End Sub
- End Class
Wenn nun eine Karte gespielt wird, rufe ich die Funktion auf:
Ist das soweit sinnvoll? Die Koordinaten muss ich ja trotzallem pro Karte immer ausrechnen und falls eine Karte vom Brett entfernt wird, ist der Platz für eine andere ja wieder frei. -
Schmandal schrieb:
Ist das soweit sinnvoll?
Die KlasseCards
darf nix wissen vongame.brett
undgame.MImages
. Gib ihr kein Pain-Event, sondern eine Draw-Prozedur, der Du das Graphics-Objekt als Parameter übergibst.
Eine Funktion, die nurTrue
zurückgibt, taugt nix, mach da ne Sub draus.Das Bild selbst übergib im Konstruktor.
Wenn Du die Karten später bewegen willst, übergib die Koordinaten an die Draw-Prozedur direkt.Die Instanz invalidisieertr kein äußeres Objekt. So etwa:
VB.NET-Quellcode
- Public Class Cards
- Private Image As Image
- Public Property x As Integer
- Public Property y As Integer
- Public Property cardname As String
- Public Sub New(cname As String, img As Image, xcoord As Integer, ycoord As Integer)
- x = xcoord
- y = ycoord
- cardname = cname
- Image = img
- End Sub
- Public Sub DrawMe(g As Graphics)
- g.DrawImage(Image, x, y, 100, 100)
- End Sub
- Public Sub DrawMe(g As Graphics, xx As Integer, yy As Integer)
- x = xx
- y = yy
- g.DrawImage(Image, xx, yy, 100, 100)
- End Sub
- End Class
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! -
Ach super! Vielen Dank. Wenn man es einmal verstanden hat, macht es iwie Sinn :). Da ich ja derzeit noch mit png's arbeite. Gibt es eine Möglichkeit das Bild direkt in ein BMP umzuwandeln und macht das überhaupt Sinn wegen der Geschwindigkeit? Ich könnte natürlich das Bild nochmal als Bitmap speichern, aber das ist glaube ich überhaupt keine gute Idee.
Ich frage wegen: Additional information: Ein Grafikobjekt kann nicht aus einem Bild mit einem indizierten Pixelformat erstellt werden. -
Schmandal schrieb:
indizierten Pixelformat
VB.NET-Quellcode
- Dim bmpIndexed = New Bitmap("C:\test\8bpp.tif")
- Dim bmp = New Bitmap(bmpIndexed.Width, bmpIndexed.Height, Imaging.PixelFormat.Format32bppArgb)
- Using g = Graphics.FromImage(bmp)
- g.DrawImage(bmpIndexed, 0, 0)
- 'bmp.Save("c:\temp\32bpp.png", Imaging.ImageFormat.Png)
- End Using
- Me.BackgroundImage = bmp ' verwenden
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! -
Alles klar, das klappt wunderbar. Auch wenn es langsam peinlich wird, aber ich schaffe es auf keiner Picturebox noch sonst iwo die Größe des Bildes zu ändern :(. Also meine Angaben zu Width und Height scheinen keine Auswirkungen zu haben. Habe nun alle Möglichkeiten durch, aber die Bilder bleiben immer alle in Originalgröße.
-
Schmandal schrieb:
alle Möglichkeiten durch
VB.NET-Quellcode
- Public Class Form1
- Private bmp As Bitmap
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- bmp = New Bitmap("C:\Temp\Test.png")
- PictureBox1.Invalidate()
- End Sub
- Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
- PictureBox1.Invalidate()
- End Sub
- Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
- If bmp Is Nothing Then
- Return
- End If
- Dim x = 10 + CInt(Me.NumericUpDown1.Value)
- e.Graphics.DrawImage(bmp, New Rectangle(0, 0, x, x))
- End Sub
- End Class
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! -
Ach super, vielen Dank! Dadurch konnte ich nun schon alles anpassen, was das Interface angeht. Nun würde mich nur noch interessieren, wie man das geschickterweise mit den Kartenanordungen machen sollte.
Bei den Karten an sich, brauche ich ja praktisch nur noch die Kartenid, die ich ausspielen will. Doch müste ich ja trotzdem jede Karte einzen zeichnen und überprüfen?
Mal angenommen in eine Reihe passen 10 Karten nebeneinander. Das kann ich ja mit der Breite und den Coords lösen. Wenn nun aber eine weitere dazu kommt, so müsste ich ja alle Karten mehr zusammenrücken und alle neu zeichnen, richtig? Wenn dann aus dieser Reihe auf einen Schlag 5 Karten wegfallen würden, müsste ich auch alles erneut rechnen und zeichnen. Die Koordinaten würde ich, wenn ich alles nun richtig verstanden habe alle nur an die Draw Prozedur weitergeben?
In Kürze: Ich muss für alle Karten ständig alle Koordinaten berechnen und weitergeben? Ich frage nur, weil es irgendwie viel aufwendiger zu sein schien, als der FlowLayoutPanel Ansatz :). -
Schmandal schrieb:
ständig alle Koordinaten berechnen
Du hast iwo eineList(Of Cards)
und Du machst Dir einfach eineDrawAllCards()
-Routine. Dort perFor Each
durchgehen und die Koordinate der nächsten Karte per Offset zur letzten Karte berechnen.
Und für die Zukunft:
Gib Deinen Karten ein Deckblatt, da kannst Du sie auch anders herum zeichnen (also die Rückseite).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! -
Ok. Ich habe gerade die Routine erstellt und das Zeichnen der Karten funtioniert wunderbar und geht recht fix :). Ich habe den Karten auch ein Deckblatt verpasst. Es gibt ja einen Nachziehstapel, bei dem die Karten andersherum liegen.
Was ich noch net ganz blicke @ Offset: Wenn ich 4 Karten nebeneinander habe und es kommen beim nächsten Zug 3 weg und eine wieder dazu. Wie kann ich das in einem Rutsch mit Offsets berechen, oder muss die Routine dazu 4 bzw. sogar 5 mal durchlaufen werden? Ich hoffe, dass Du verstehst wie ich das meine -
Vielleicht machst Du den Offset von der Anzahl der Karten abhängig. Wenn es schnell genug geht, male immer alle Karten neu.
Vielleicht kannst Du auch die Größe des Bildes von der Anzahl abhängig machen, dann gib den Karten noch ne Property Zoom.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! -
Hm, alles hat soweit wunderbar funktioniert, bis auf eine kleine Sache. Alle Bildchen sind nun extrem unscharf und wenn ich ehrlich bin, keine Ahnung warum das so ist.
Habe folgende sub:
VB.NET-Quellcode
- Public Sub paintbyname()
- For Each mole In Cartographer
- For Each muh In MyImages
- If muh.Name & ".png" = mole Then
- bmpIndexed = New Bitmap(sAppPath & "karten\" & mole)
- bmp = New Bitmap(bmpIndexed.Width, bmpIndexed.Height, Imaging.PixelFormat.Format32bppArgb)
- Using g = Graphics.FromImage(bmp)
- g.DrawImage(bmpIndexed, 0, 0)
- End Using
- NumericUpDown1.Value = NumericUpDown1.Value + 30
- bmaps.Images.Add(mole, bmp)
- End If
- Next
- Next
- PictureBox1.Invalidate()
und
und
-
@Schmandal Poste mal ein paar Originalbildchen.
Wahrscheinlich müssen die geeignet gerendert werden, da musst Du Dir mal die Überladungen vonDrawImage()
ansehen.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! -
Guten Morgen @RodFromGermany
Hier mal ein nicht verkleinertes png:
Und so sieht das ganze dann auf dem Brett aus (nur die Karte):
Ich habe mir alles durchgelesen, womit ich was anfangen konnte oder dachte ich könnte das Problem lösen. Nach einem Tag war ich mir nun sicher: zu wenig Geist
-
Ähnliche Themen
-
~Revolt~ - - Sonstige Problemstellungen
-
3 Benutzer haben hier geschrieben
- Schmandal (90)
- ErfinderDesRades (58)
- RodFromGermany (38)