GDI-Objekt lässt lücken beim zoomen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Chinafreak.

    GDI-Objekt lässt lücken beim zoomen

    Hallo Ihr lieben,

    wieder habe ich hier ein Problem, erstmal zeige ich euch das Bild/Animation, was mehr als 1000 Wörter sagt:




    Kann einer mir sagen, woran das liegen könnte?

    Der Code von zoomen sieht so aus:

    Spoiler anzeigen

    Quellcode

    1. Private Sub Form1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
    2. Dim w As Single = Panel1.Width / 10
    3. Dim h As Single = Panel1.Height / 10
    4. Dim zoom_faktor_x As Single = Panel1.Width / Room_Level_Width
    5. Dim zoom_faktor_y As Single = Panel1.Height / Room_Level_Height
    6. If e.Delta > 0 Then
    7. zoom_width += w
    8. zoom_height += h
    9. Panel1.Width = Room_Level_Width + zoom_width
    10. Panel1.Height = Room_Level_Height + zoom_height
    11. Panel1.Location = New Point(Panel1.Location.X - w / 2, Panel1.Location.Y - h / 2)
    12. Me.Invalidate()
    13. Else
    14. If Panel1.Width > 16 Or Panel1.Height > 16 Then
    15. zoom_width -= w
    16. zoom_height -= h
    17. Panel1.Width = Room_Level_Width + zoom_width
    18. Panel1.Height = Room_Level_Height + zoom_height
    19. Panel1.Location = New Point(Panel1.Location.X + w / 2, Panel1.Location.Y + h / 2)
    20. Me.Invalidate()
    21. End If
    22. End If
    23. End Sub


    Und der GDI-Objekt sieht so aus:

    Spoiler anzeigen

    Quellcode

    1. Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
    2. With e.Graphics
    3. .InterpolationMode = InterpolationMode.NearestNeighbor 'Damit der GDI-Objekt nicht so verschwommen aussieht
    4. .PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality 'Joa... eigentlich soll DIESER befehl das Problem lösen... aber ich glaube, damit hat es nicht zu tun
    5. Dim zoom_faktor_x As Single = Panel1.Height / Room_Level_Height 'Erhalte den Zoom aspect ratio in bereich Width, das wird beim zoomen benötigt
    6. Dim zoom_faktor_y As Single = Panel1.Height / Room_Level_Height 'Erhalte den Zoom aspect ratio in bereich Height, das wird beim zoomen benötigt
    7. If Not Room_Level_Tiles_amount <= 0 Then 'Menge von GDI-Objekt
    8. Dim i_tiles As Integer = 0
    9. While i_tiles <= Room_Level_Tiles_amount 'Zeichne alle GDI-Objekt, was in Arrays gespeichert sind
    10. If Room_Level_Tiles_amount > i_tiles Then
    11. Dim x As Integer = 0
    12. Dim y As Integer = 0
    13. x = Room_Level_Tiles_x(i_tiles) 'Room Level Tiles X sind sowieso in Integer gespeichert, da gibt es also keine Kommastellung
    14. y = Room_Level_Tiles_y(i_tiles) 'siehe oben
    15. Dim img_rec = New Rectangle(Panel1.Location.X + x * zoom_faktor_x, Panel1.Location.Y + y * zoom_faktor_y, Room_Level_Tiles_surface(i_tiles).Width * zoom_faktor_x, Room_Level_Tiles_surface(i_tiles).Height * zoom_faktor_y)
    16. ' Panel1.Location -> Position von Panel
    17. ' Room_Level_Tiles_surface(i_tiles).Width -> das ist eine Bild, welches die Länge "Width" herausgibt. Auch hier ist in Integer gespeichert.
    18. .DrawImage(Room_Level_Tiles_surface(i_tiles), img_rec) 'Zeichne den GDI-Objekt
    19. End If
    20. i_tiles += 1
    21. End While
    22. End If
    23. End With
    24. End Sub



    Auf Antwort würde ich mich supi freuen! :)


    MfG.

    China
    Mach's doch einfach zum Feature -> Defekte Straßen :D
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Trade Er meinte wohl eher die grünen Linien, die im Grenzbereich einzelner Tiles(?) auftreten. ;)

    PS: @Chinafreak Sehe ich das richtig, dass du zuerst die Grasflächen überall zeichnest und dann die anderen Objekte darüberklatschst?
    Achso :D
    Dann hau mal AntiAliasing rein.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Higlav ganz genau, weil das als "Hintergrund" darstellen soll. Dieser Hintergrund als Bitmap zu speichern ist keine so gute Idee... wenn ich eine sehr große Raum haben möchte... dann würde der RAM platzen :D Aber Performance habe ich bisher noch keine Probleme gehabt. Auch bei extrem großen Raum mit haufenweise GDI-Objekten.

    @Trade ".SmoothingMode = Drawing2D.SmoothingMode.AntiAlias" hat leider nicht gebracht... Im gegenteil, es ist ein tick schlimmer geworden... :/

    Trotzdem danke schön für eure Antworten <3

    [EDIT]

    Wie es aussieht, habe ich "Hintergrund"-Code vergessen einzufügen:

    Spoiler anzeigen

    Quellcode

    1. Dim back = Room_Level_Background_image(0)
    2. If Room_Level_Background_stretch(0) = "-1" Then
    3. .DrawImage(Back, New Rectangle(Room_Level_Background_x(0), Room_Level_Background_y(0), Room_Level_Width, Room_Level_Height))
    4. Else
    5. Dim width As Integer = Back.Width * Panel1.Width / Room_Level_Width
    6. Dim height As Integer = Back.Height * Panel1.Height / Room_Level_Height
    7. Dim multi_x As Integer = 0
    8. Dim multi_y As Integer = 0
    9. Dim crop_x As Integer = 0
    10. Dim crop_y As Integer = 0
    11. Dim htile As Integer = 0
    12. Dim hback As Integer = 0
    13. Dim vtile As Integer = 0
    14. Dim vback As Integer = 0
    15. If Room_Level_Background_htiled(0) = "-1" Then
    16. htile = 1
    17. hback = Back.Width * Panel1.Width / Room_Level_Width
    18. Else
    19. htile = 0
    20. hback = 0
    21. End If
    22. If Room_Level_Background_vtiled(0) = "-1" Then
    23. vtile = 1
    24. vback = Back.Height * Panel1.Height / Room_Level_Height
    25. Else
    26. vtile = 0
    27. vback = 0
    28. End If
    29. For index_y As Double = 0 To Panel1.Height * vtile Step Back.Height * Panel1.Height / Room_Level_Height
    30. multi_x = 0
    31. multi_y += 1
    32. For index_x As Double = 0 To Panel1.Width * htile Step Back.Width * Panel1.Width / Room_Level_Width
    33. multi_x += 1
    34. If multi_x * Back.Width > Room_Level_Width Then
    35. crop_x = (multi_x * Back.Width) - Room_Level_Width
    36. Else
    37. crop_x = 0
    38. End If
    39. If multi_y * Back.Height > Room_Level_Height Then
    40. crop_y = (multi_y * Back.Height) - Room_Level_Height
    41. Else
    42. crop_y = 0
    43. End If
    44. Dim img_rec As New Rectangle(Panel1.Location.X + index_x, Panel1.Location.Y + index_y, width - (crop_x * zoom_faktor_x), height - (crop_y * zoom_faktor_y))
    45. Dim crop_rec As New Rectangle(0, 0, Back.Width - crop_x, Back.Height - crop_y)
    46. .DrawImage(Back, img_rec, crop_rec, GraphicsUnit.Pixel)
    47. '.Dispose()
    48. Next
    49. Next
    50. End If


    Wieso der so lang ist -> Es gibt einfach halt sehr viele Einstellungsmöglichkeiten für Hintergründe :D Dieser Code befindet sich in "Form.Paint"

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Chinafreak“ ()