Bemaßungen Ein- Ausblenden

  • VB.NET

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

    Bemaßungen Ein- Ausblenden

    Hallo Experten,

    mit meinem kleinen Projekt bin ich langsam weitergekommen. Danke für Eure Unterstützung!

    Jetzt komme ich nicht recht weiter. Ich möchte, in einer Picturebox, Bemaßungen einblenden wenn sich der Mauszeiger über einem Eingabefeld befindet. Das soll dem User zeigen welche Änderungen durch seine Eingaben zu erwarten sind. Der Sinn legt darin, dass ich so nicht jedes Teil explizit Beschreiben muss.

    Bisher habe ich es mit "MouseOver" des Textfeldes zur Eingabe versucht. Meine Linie wird auch gezeichnet wenn ich das Eingabefeld "überfahre". Nach Verlassen sollen natürlich diese Hilfslinien wieder verschwinden. Da ich ca. 40 Eingabefelder habe suche ich nach einer eleganten Lösung.
    Warum nimmst du statt MouseMove/MouseOver nicht die Ereignisse MouseEnter und MouseLeave? Das sollte das leisten was du vorhast.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Danke für die schnelle Antwort.

    Mein Problem ist eher das Zeichnen in der Picbox. Diese Mouse - Ereignisse habe ich doch außerhalb der Picbox.

    Bestimmt wieder so eine einfache Sache bei der ich mich bei der nächsten Antwort am liebsten verstecken würde....
    Wie zeichnest du denn diese Linie in dein Bild? Wie löst du effektiv aus, dass diese Hilfslinie (die im ersten Post als Beispiel nanntest) erscheint?

    Normale Vorgehensweise wäre:

    Du nimmst eine Variable, die bestimmt, ob deine Hilfslinie angezeigt werden soll oder nicht (und ggf. weitere Hilfestellungen für andere Textfelder, z.B. durch ein Enum)

    VB.NET-Quellcode

    1. Dim currentLegend As ShowLegendType
    2. Enum ShowLegendType
    3. None
    4. Width
    5. Length
    6. Thickness
    7. HoleDepth
    8. Infeed
    9. '...
    10. End Enum


    In MouseEnter der TextBoxen setzt du die Variable dann auf den zur Textbox zugehörigen Wert, in MouseLeave setzt du sie generell auf None.

    Dein Bild selbst zeichnest du (ausschließlich) im Paint-Ereignis - kein CreateGraphics oder son Kram - und kannst dann dort je nach Zustand deiner Variablen die zusätzliche Hilfs-Legende in die PictureBox zeichnen. Damit die Graphik auch korrekt aktualisiert wird, solltest du in den MouseEnter- und MouseLeave-Events mindestens ein PictureBox.Invalidate() aufrufen.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Danke,

    bisher habe ich ein Bit gesetzt und dann im Paint-Event mit "If-Then" meine (Test)Linie gezeichnet.

    Bitte entschuldige wenn mich bei Deinem Codeschnipsel nur Fragezeichen umkreisen. Damit muss ich mich erst einmal befassen. Ich bin noch ganz am Anfang und freu mich derzeit über meine bescheidenen Ergebnisse.

    Es ist schon richtig, dass Ihr hier keinen "C&P-Code" postet, andererseits kann ich mit praktischen Beispielen am schnellsten verstehen wie das funktioniert. Ich möchte mein Programmchen aber selber schreiben!
    Okay, hier mal ein lauffähiges Beispiel. Um es lauffähig zu machen brauchst du zwei Textboxen TextBox1 und TextBox2 sowie eine PictureBox namens PictureBox1, deren Größe mind. 100 x 100 ist.
    Ist jedenfalls noch verbesserungsfähig, aber es reicht um das Prinzip das ich meinte zu demonstrieren:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Enum HintType
    3. None
    4. Hint1
    5. Hint2
    6. End Enum
    7. Private currentHint As HintType = HintType.None
    8. Private Sub ShowHint1(sender As Object, e As System.EventArgs) Handles TextBox1.MouseEnter, TextBox1.GotFocus
    9. currentHint = HintType.Hint1
    10. PictureBox1.Invalidate()
    11. End Sub
    12. Private Sub ShowHint2(sender As Object, e As System.EventArgs) Handles TextBox2.MouseEnter, TextBox2.GotFocus
    13. currentHint = HintType.Hint2
    14. PictureBox1.Invalidate()
    15. End Sub
    16. Private Sub HideHint(sender As Object, e As System.EventArgs) Handles TextBox1.MouseLeave, TextBox2.MouseLeave, TextBox1.LostFocus, TextBox2.LostFocus
    17. currentHint = HintType.None
    18. PictureBox1.Invalidate()
    19. End Sub
    20. Private Sub PictureBox1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    21. e.Graphics.DrawRectangle(Pens.Black, 0, 0, 100, 100)
    22. Select Case currentHint
    23. Case HintType.Hint1
    24. e.Graphics.FillRectangle(Brushes.Red, 10, 10, 40, 40)
    25. Case HintType.Hint2
    26. e.Graphics.FillRectangle(Brushes.Blue, 50, 50, 40, 40)
    27. End Select
    28. End Sub
    29. End Class
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Danke,

    das werde ich gern testen!

    Im Übrigen programmiere ich, mit meinen knapp 60 Lenzen, seit vielen Jahren SPS. Vielleicht hab ich mir dabei (viel Siemens) das logische Denken verdorben. Vor vielen Jahren war dann auch mal etwas Basic und Pascal dabei. Das ist aber schon seeehr lange her...

    Einen schönen Restsonntag noch.

    Hannes
    Ohje... ich hatte bisher das Glück damit nicht in Kontakt zu kommen, aber ein paar Arbeitskollegen können von Siemens-Steuerungen ein Liedchen singen... ;)
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Steamjoe schrieb:

    Das hilft mir sehr weiter!
    So soll es sein.
    Vielleicht noch was "philosophisches":
    Das Paint-Event zeichnet die gesamte Darstellungsfläche "aus dem Gedächtnis". Daten werden bereitgestellt, Flags werden gesetzt.
    Je nach Aufgabe (Daten und Flags) wird dann das eine oder das andere gezeichnet.
    Wenn Du weißt, wo genau Du wieviel zeichnen musst
    und
    wenn Du weißt, was aktuell dargestellt ist,
    kannst Du den Zeichenvorgang wesentlich beschleunigen, wenn Du nicht die ganze PictureBox invalidisierst, sondern nur den Teil, der von der nächsten Änderung der Darstellung direkt betroffen ist.
    Dafür gibt es eine Reihe von Überladungen für Invalidate(...) mit Rectangle und Region, wo dann nur der zu ändernde Teil des Bildes tatsächlich neu gezeichnet wird.
    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!