Eigene Klassen Mousclick event hinzufügen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Eigene Klassen Mousclick event hinzufügen

    Wie schon meine Überschrift sagt, hab ich ein Problem mit einer Klasse. Unzwar ist die Klasse nichts anderes als eine Klasse die ein 32*32 Feld zeichnet, dies mit einem vordefiniertem bild auf einer Picturebox. Das klappt auch super, meine frage ist es jetzt aber wie ich diese Klasse mit einem mouscklick event ausstatten kann, sodass wenn der user auf eins meiner Felder klickt ein ereigniss durchgeführt wird, also so etwas wie ein button eigentlich.

    Mein Versuch war es der Klasse z.B. die Label Klasse zu vererben dort gibt es ja ebenfalls das event Mous cklick. Nun hab ich aber ein array mit 250 Feldern und es wäre äußerst mühsam für jedes feld den code einzeln aufzuschreiben da gibt es doch sicherlich eine "schlauere" lösung oder nicht?

    Ich hab mir überlegt das ich in der Klasse selbst definiere was passieren soll wenn das mous click event ausgelöst wird. also z.B. so

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class FeldInherits Windows.Forms.Label
    2. Public Event Feld_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    3. Feld_Click()
    4. 'code...
    5. End Feld_click
    6. End Class


    aber wie lautet der richtige code ?(

    lg Blitzbirnep
    Folgende Klasse erstellem:

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Public Class Feld
    3. Inherits Label
    4. End Class
    Compilieren
    Ein Control des Typs Feld auf Deine Form ziehen
    das gewünschte Event anklicken und schon hast Du im Code Deiner Form den entsprechenden Eventhandler. Den kannst Du weiterreichen oder bist fertig.
    Bilder
    • Feld.jpg

      5,29 kB, 153×101, 503 mal angesehen
    • Event.jpg

      23,64 kB, 312×382, 119 mal angesehen
    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!
    Ja vom Label zu erben ist wirklich ein bisschen unlogisch, das stimmt, ich dachte nur ich muss von einem control erben das dieses mouscklick event hat um es ein bisschen zu verändern.

    Aber so leicht war es dann doch nicht und an RodFromGermany, ich hab dein Lösungsvorschlag grad versucht, das klingt auch logisch aber nicht ganz nach meiner vorstellung.

    Mein Ziel ist es eine Klasse zu erstellen bessergesagt ein Control. Wenn ich jetzt dem control die Koordinaten (0|0) gebe dann soll es nicht in der Oberen Ecke der Form plaziert werden sondern in der Oberen ecke von Picturebox. Ich weiß nicht genau wie ich es erklären soll.

    Hier mein Code von der Klasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Feld
    2. Inherits System.Windows.Forms.Label
    3. Public Sub New()
    4. End SubPublic Sub New(ByVal XY As Point, ByVal Grap As Graphics)
    5. m_xy = XY
    6. m_font = Feldfont.Nichts
    7. m_g = Grap
    8. End Sub
    9. Public Enum Feldfont As Integer
    10. Selection
    11. Mauer
    12. Gegner
    13. Pacnep
    14. Nichts
    15. End EnumPrivate m_font As Feldfont
    16. Private m_xy As PointPrivate m_g As Graphics
    17. Private m_image As Image
    18. 'Public Property Feld_Font() As Feldfont
    19. ' Get
    20. ' Return m_font
    21. ' End Get
    22. ' Set(ByVal value As Feldfont)
    23. ' m_font = value
    24. ' End Set'End Property
    25. 'Private Sub Klick() Handles Me.MouseClick
    26. ' m_g.DrawImage(My.Resources.Selection1, m_xy.X, m_xy.Y, 32, 32)
    27. 'End SubPublic Sub Zeichnen(ByVal Font As Feldfont)
    28. Select Case m_fontCase Is = Feldfont.Gegner
    29. m_image = My.Resources.gegnerCase Is = Feldfont.Mauer
    30. m_image = My.Resources.Mauer1Case Is = Feldfont.Nichts
    31. m_image = NothingCase Is = Feldfont.Pacnep
    32. m_image = My.Resources.PacnetCase Is = Feldfont.Selection
    33. m_image = My.Resources.Selection1
    34. Case Else
    35. m_image = NothingEnd Select
    36. Try
    37. m_g.DrawImage(m_image, m_xy.X, m_xy.Y, 32, 32)Catch ex As Exception
    38. m_g.DrawRectangle(Pens.Black, New Rectangle(m_xy, New Size(32, 32)))
    39. End TryEnd Sub
    40. End Class


    Wie kann man bilder hochladen?? -sorry bin noch neu. Bei diesem Bild einfügen da muss ich immer eine url angeben ?(

    Hier der code für das Zeichnen
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadDim counter As Integer = -1
    2. Dim posx, posy As IntegerFor x As Integer = 1 To 20
    3. posx = -32 + x * 32For y As Integer = 1 To 15
    4. posy = -32 + y * 32
    5. counter += 1Felder(counter) = New Feld(New Point(posx, posy), Leveldisplay.CreateGraphics)
    6. Next
    7. NextEnd Sub

    VB.NET-Quellcode

    1. Private Sub Raster()Dim g As Graphics = Leveldisplay.CreateGraphicsFor Each feld As Feld In Felder
    2. feld.Zeichnen(Pac_Editor.Feld.Feldfont.Nichts)
    3. NextEnd Sub

    Blitzbirnep schrieb:

    Wie kann man bilder hochladen??

    Unter diesem Edit-Feld ist ein Tab-Dialog mit
    Smileys | Einstellungen | Dateianhänge | Umfrage | Zitate
    ---------------
    Überleg erst mal genau, was Du eigentlich willst. Beschreibe es so genau wie möglich und zeige Deine Lösungsansätze.
    Dann wird Dir ganz bestimmt und fix geholfen.
    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!
    Ah ok danke.

    Ja Hab ich doch gemacht :!: :?:

    Mein Ziel ist es ein Objekt auf eine Picturebox zu zeichnen das einen mouscklick event besitzt.

    Meine ansätze sind im vorigen beitrag.

    lg Blitzbirnep

    Ps: Jedes einzelne Kästchen ist ein Feld aus der Klasse Feld.
    Bilder
    • Oberfläche.jpg

      52,28 kB, 880×621, 160 mal angesehen
    Male das alles in die PictureBox.
    Fange deren MouseKlick ab, ermittle aus den Klick-Koordinaten die Koordinaten des Objekts, identifiziere das Objekt und leite das Klick-Event an das Objekt weiter.
    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, das klingt gut.

    Gezeichnet hab ich schon alles die felder werden aber z.b immer nur auf den Koordinaten

    [1.Reihe] (0,0); (32,0); (64,0) ....

    [2.Reihe] (0,32); (32,32); (64,32) ....

    ....

    gezeichnet, dann müsste der user immer genau auf die Koordinaten klicken, die wahrscheinlichkeit ist aber ziemlich klein. wie kann ich denn eine Abfrage machen das im ganzen Feld gecklickt werden kann ?(

    VB.NET-Quellcode

    1. Private Sub Leveldisplay_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Leveldisplay.MouseClick
    2. Dim x, y As Integer
    3. x = e.X
    4. y = e.Y
    5. For Each item As Feld In Felder 'Felder ist mein array mit den einzelnen Feld
    6. If item.X = x And item.Y = y ThenMsgBox("Jetzt wurde genau auf die Obere ecke gecklickt")
    7. End If
    8. NextEnd Sub

    so kann ich das lösen aber das oben genannte problem besteht immer noch :|
    lg Blitzbirnep

    VB.NET-Quellcode

    1. IndexX = Mouse.X \ 32
    2. IndexY = Mouse.Y \ 32
    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!
    Das verstehe ich nicht ?(

    Ich hab die lösung gefunden:

    VB.NET-Quellcode

    1. Private Sub Leveldisplay_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Leveldisplay.MouseClick
    2. Dim x, y As Integer
    3. x = e.X
    4. y = e.Y
    5. For Each item As Feld In Felder 'Felder ist mein array mit den einzelnen Feld
    6. If item.X = x And item.Y = y ThenMsgBox("Jetzt wurde genau auf die Obere ecke gecklickt")
    7. End IfFor xx As Integer = 1 To 32
    8. For yy As Integer = 1 To 32
    9. If xx + item.X = x And yy + item.Y = y ThenMsgBox("Jetzt wurde in das Feld gecklickt" & vbNewLine _
    10. & "Mit der oberen ecke: (" & item.X & "|" & item.Y & ")")
    11. End If
    12. Next
    13. Next
    14. NextEnd Sub

    Blitzbirnep schrieb:

    Das verstehe ich nicht ?(

    Ist doch irgendwie eleganter. Oder?

    VB.NET-Quellcode

    1. Private Sub Leveldisplay_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Leveldisplay.MouseClick
    2. Dim x, y As Integer
    3. x = e.X \ 32
    4. y = e.Y \ 32
    5. MsgBox("Jetzt wurde in das Feld gecklickt" & vbNewLine & "Mit der oberen ecke: (" & x.ToString & "|" & y.ToString & ")")
    6. End Sub
    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!
    Dann benutze auch den Hilfreich-Button rechts unter dem Beitrag. :thumbsup:
    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!