Verständnisfrage GDI+

  • VB.NET

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

    Verständnisfrage GDI+

    Hallo Leute,

    ich habe eine Frage an euch, wenn hier im Forum jemand z.B. ein Spiel erstellt ist einer der Wichtigsten Punkte ob die Darstellung mit Controls oder GDI+ erfolgte, GDI+ hat natürlich gegenüber Controls sehr viele Vorteile, das ist mir klar...

    Ich habe so etwas ähnliches vor, ich würde gerne eigene "Objekte" angelehnt an HTML-Tags erzeugen könnnen...
    Die Objekte z.B. Div (=Rechteck) will ich dann per GDI+ auf einen Workspace zeichnen, z.B. mein Panel.

    Nun will ich aber die Eigenschaft dieses Objektes Ändern können (Farbe, Border, Height, Width, usw...)
    Wie kann ich denn dieses Objekt überhaupt klickbar machen und woher weiß ich welches Objekt geklickt wurde ?(

    Hier mal mein Ansatz...

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class objekte
    3. Public Enum ObjektTyp
    4. Rechteck
    5. Absatz
    6. Text
    7. Bild
    8. Überschrift
    9. End Enum
    10. Public Enum ZentrierungsArt
    11. Links
    12. Mitte
    13. Rechts
    14. End Enum
    15. Public Enum RandTyp
    16. Durchgehend
    17. Gestrichelt
    18. Gepunktet
    19. none
    20. End Enum
    21. Private HTML_Text As System.Text.StringBuilder
    22. Private CSS_Text As System.Text.StringBuilder
    23. Private Property ID As String
    24. Private Property Klasse As String
    25. Private Property Typ As ObjektTyp
    26. Private Property Breite As Integer
    27. Private Property Höhe As Integer
    28. Private Property Zentrierung As ZentrierungsArt
    29. Private Property HintergrundFarge As System.Drawing.Color
    30. Private Property VordergrundFarbe As System.Drawing.Color
    31. Private Property Außenabstand_Links As Integer
    32. Private Property Außenabstand_Rechts As Integer
    33. Private Property Außenabstand_Oben As Integer
    34. Private Property Außenabstand_Unten As Integer
    35. Private Property Innenabstand_Links As Integer
    36. Private Property Innenabstand_Rechts As Integer
    37. Private Property Innenabstand_Oben As Integer
    38. Private Property Innenabstand_Unten As Integer
    39. Private Property RandArt As RandTyp
    40. Private Property RandDicke As Integer
    41. Private Property RandFarbe As System.Drawing.Color
    42. Public Sub New(ByVal ws As Control, ByVal Obj As ObjektTyp)
    43. Typ = Obj
    44. Select Case Typ
    45. Case ObjektTyp.Rechteck
    46. Me.Höhe = 50
    47. Me.Breite = ws.Width
    48. Dim g As Graphics = Graphics.FromHwnd(ws.Handle)
    49. g.DrawRectangle(Pens.Black, New Rectangle(frm_main.WidthNow, frm_main.HeightNow, Me.Breite - 3, Me.Höhe))
    50. frm_main.HeightNow += Me.Höhe
    51. End Select
    52. End Sub
    53. End Class
    Anders ^^

    Du nimmst das zeichnen erstmal aus New weg, un fügst die Eigenschaft Rectangle und eine Methode Draw(gfx As graphics) hinzu.

    Wenn du nun in deinem eigentlichen Programm bist(Form1 bspw.) dann kommt als globale Variable iwo obj As New objekte und in die MyBase.LOad kommen die Properties, unter anderem auch .Rectangle, welche beschreibt wo dieses Objekt gezeichnet werden soll.
    In der Form.Paint-Methode schreibst du dann nur noch obj.Draw(e.Graphics) :)

    EDIT: Klicken geht genauso: In der MouseDown-Sub der Form (oder des Panels) fragst du ab ob obj.Rectangle.IntersectsWith(New Rectangle(e.Location, New Size(1, 1). Wenn ja, wurde dein Objekt geklickt.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Also wenn das wirklich ein komplettes UI-System werden soll, dann kommst du damit nicht weiter.
    Um eine ähnliche Funktionalität wie unter WinForms zu erreichen (und diese Funktionalität ist für eine schöne, intuitive und trotzdem komplexe GUI eigentlich zwingend erforderlich), dann wird das schon etwas mehr Code werden. Ich entwickle gerade selbst eine kleine GameEngine und hab UI schon fertig implementiert, du kannsts dir ja mal anschauen: github.com/Artentus/GameUtils/…er/GameUtils/GameUtils.UI
    Du klickst einfach auf eine Datei und siehst den Code. :)
    Das UI-System ist an WinForms angelehnt, aber es gibt einen entscheidenden Unterschied. Bei nem Spiel möchte man, dass bei nem Resize des Fensters die Proportionen beibehalten werden, also werden alle Positions- und Größenangaben in Prozent gemacht, anstatt in absoluten Pixeln. Das System läuft aber nur mit GameUtils, du musst entweder die komplette Engine nehmen oder den Code umschreiben.