NumericUpDown mit rechter Maustaste bedienen

  • VB.NET

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von Humax.

    NumericUpDown mit rechter Maustaste bedienen

    Hallo, ist es möglich die Value-Eigenschaft des NumericUpDown-Controls mit der rechten Maustaste zu erhöhen / verringern?

    Ich würde gerne wenn man mit der rechten Maustaste auf das NumericUpDown-Control klickt (auf die Pfeile), dass sich Value nicht um 1 sondern beispielsweise um 10 erhöht / verringert.

    Ich habe mit folgendem Code das Contextmenu "ausgeschaltet", welches normalerweise angezeigt wird, wenn man mit der rechten Maustaste auf das Control klickt.

    VB.NET-Quellcode

    1. Dim CMenu As ContextMenu = New ContextMenu
    2. NumericUpDown_SoldierStats.ContextMenu = CMenu


    Im MouseDown-Event dann folgenden Code

    VB.NET-Quellcode

    1. If e.Button = MouseButtons.Left Then
    2. NumericUpDown_SoldierStats.Increment = 1
    3. Else
    4. NumericUpDown_SoldierStats.Increment = 10
    5. End If


    So kann ich zumindest wenn ich mit der rechten und dann mit der linken Maustaste klicke, einmal den Wert um 10 erhöhen / verringern. Wenn ich dann wieder mit der linken Drücke ist "Increment" natürlich wieder 1. Da sich das Control nicht mit der rechten Maustaste bedienen lässt.
    Gibt es dafür eine Lösung?
    @Humax So was:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. NumericUpDown1.ContextMenu = New ContextMenu
    4. End Sub
    5. Private Sub NumericUpDown1_MouseDown(sender As Object, e As MouseEventArgs) Handles NumericUpDown1.MouseDown
    6. If e.Button = Windows.Forms.MouseButtons.Right Then
    7. NumericUpDown1.Value += 1
    8. End If
    9. End Sub
    10. 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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Humax Ich habe Dir gezeigt, wie es überhaupt geht.
    Selbstverständlich musst Du dieses Snippet Deinen Bedürfnissen anpassen.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Humax Schreib mal auf, was alles passieren können soll.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Naja der Anwender sol im NumericUpDown die Werte erhöhen und vermindern können. Bei angewendetem Linksklick um 1 bei Rechtsklick um sagen wir jetzt mal 10.
    Sonst eigentlich nix.
    Hier mal meine 1. Lösung: (die Werte für x und y stimmen natürlich nur bei der ausgewählten Schriftgröße)

    VB.NET-Quellcode

    1. Dim x As Integer = e.X
    2. Dim y As Integer = e.Y
    3. ' Im Bereich x 75 bis 90 und Bereich y 1 bis 20 wurde auf die Pfeile geklickt um den Wert zu ändern
    4. If x > 74 And x < 91 And y > 0 And y < 11 Then ' Wert erhöhen
    5. If e.Button = MouseButtons.Right Then
    6. NumericUpDown_SoldierStats.Value += 10
    7. End If
    8. ElseIf x > 74 And x < 91 And y > 10 And y < 21 Then ' Wert mindern
    9. If e.Button = MouseButtons.Right Then
    10. NumericUpDown_SoldierStats.Value -= 10
    11. End If
    12. End If


    2. Möglichkeit wäre im Contextmenu des NumericUpDown die "Increment-Value" festzulegen. Womit dann mit Linksklick immer um den Wert erhöht / verringert wird.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Humax“ ()

    Humax schrieb:

    Naja
    Was haben die Klick-Koordinaten auf sich?
    Schreib eine belastbare Aufgabenstellung :!:
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Akanel schrieb:

    Sollte hier nicht zumindest And gegen AndAlso ersetzt werden? Den Rest habe ich nicht getestet.


    VB.NET-Quellcode

    1. AndAlso
    kannte ich nicht. Ja macht Sinn...

    RodFromGermany schrieb:

    Was haben die Klick-Koordinaten auf sich?


    Die Koordinaten sind nötig, damit man im Code festlegen kann ob der Wert verringert oder erhöht werden soll, und außerdem, dass es nur stattfindet, wenn man auch tatsächlich auf die Pfeile des NumericUpDown-Controls gegklickt hat und nicht einfach nur irgendwo im Control.

    Natürlich muss man noch vor ".Value"-Zuweisung prüfen ob die damit nicht überschritten wird...

    VB.NET-Quellcode

    1. Dim x As Integer = e.X
    2. Dim y As Integer = e.Y
    3. ' Im Bereich x 75 bis 90 und Bereich y 1 bis 20 wurde auf die Pfeile geklickt um den Wert zu ändern
    4. If x > 74 AndAlso x < 91 AndAlso y > 0 AndAlso y < 11 Then ' Wert erhöhen
    5. If e.Button = MouseButtons.Right Then
    6. If NumericUpDown_Money.Value + 1000000 > NumericUpDown_Money.Maximum Then
    7. NumericUpDown_Money.Value = NumericUpDown_Money.Maximum
    8. Else
    9. NumericUpDown_Money.Value += 1000000
    10. End If
    11. End If
    12. ElseIf x > 74 AndAlso x < 91 AndAlso y > 10 AndAlso y < 21 Then ' Wert mindern
    13. If e.Button = MouseButtons.Right Then
    14. If NumericUpDown_Money.Value - 1000000 < NumericUpDown_Money.Minimum Then
    15. NumericUpDown_Money.Value = NumericUpDown_Money.Minimum
    16. Else
    17. NumericUpDown_Money.Value -= 1000000
    18. End If
    19. End If
    20. End If
    @Humax Etwa so was:
    Wenn mit der rechten Maustaste auf die Pfeile eines NUD klickt, soll sich dieses verhalten, als ob mit der linken Maustaste geklickt worden sei.
    :?:
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Humax Sieh Dir mal den Mauscursor an.
    Der ist im Zahlenfeld anders als auf den Pfeiltasten.
    Probierma, den auszulesen und abzufragen.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Guck mal in NumericUpDown.Controls. Es ist nämlich ein Container. Probier mal Control für Control zu entfernen, bis du das Spin Control hast (die zwei Pfeile). Als nächstes kannst du versuchen das MouseDown/MouseClick zu abonnieren.
    /Edit
    Sowas z.B.
    Spoiler anzeigen

    C#-Quellcode

    1. public class CustomUpDown : NumericUpDown
    2. {
    3. [Category("Data")]
    4. public decimal LargeIncrement { get; set; } = 10;
    5. Control spinner = null;
    6. protected override void OnHandleCreated(EventArgs e)
    7. {
    8. base.OnHandleCreated(e);
    9. spinner = Controls[0];
    10. spinner.MouseClick += Spin_MouseClick;
    11. }
    12. private void Spin_MouseClick(object sender, MouseEventArgs e)
    13. {
    14. if (e.Button != MouseButtons.Right)
    15. return;
    16. int half_height = Size.Height / 2;
    17. if (e.Y < half_height)
    18. {
    19. // Up button
    20. Value = Math.Min(Maximum, Value + LargeIncrement);
    21. }
    22. else
    23. {
    24. // Down button
    25. Value = Math.Max(Minimum, Value - LargeIncrement);
    26. }
    27. }
    28. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gonger96“ ()

    Klingt kompliziert...
    Habe mal in den Controls geschaut. Unter NumericUpDown - "Controls" - "Innerlist" (Element 0) finde ich unter "Bounds" verschiedene angaben wie

    XML-Quellcode

    1. ​Width 1
    2. left 75
    3. top 1
    4. heigth 20 --- Geteilt durch 2 ergibt 10 , also mein y 1 bis 10 für Up und 11-20 für Down.
    5. right 91

    Das sind ja die Werte die ich mit ... geprüft hatte.

    VB.NET-Quellcode

    1. If x > 74 AndAlso x < 91 AndAlso y > 0 AndAlso y < 11 Then


    Insgesamt könnte ich dadurch den Clientbereich der Pfeile für Hoch/Runter auslesen / errechnen und müsste es nicht manuell machen, wie ich es vorhin gemacht hatte. Dadurch könnte man auch die Schriftgröße des NumericUpDown-Controls verändern und es sollte noch passen...
    Zwischenfrage: Warum benutzt Du ein NUD, wenn es nicht macht, was Du willst. Wäre da nicht ein passendes UserControl geeigneter?

    ##########

    Wenn Du schon die Mauskoordinaten mit den Pfeilbuttons abgleichen willst, dann generell und ohne Absolutkoordinaten. Geht zweifellos schöner, aber es geht:

    VB.NET-Quellcode

    1. Private Sub NumericUpDown1_MouseDown(sender As Object, e As MouseEventArgs) Handles NumericUpDown1.MouseDown
    2. Dim AbsX As Integer = Me.PointToScreen(New Point(0, 0)).X - Me.Location.X
    3. Dim AbsY As Integer = Me.PointToScreen(New Point(0, 0)).Y - Me.Location.Y
    4. Dim TargetRectangle = NumericUpDown1.Controls(0).ClientRectangle
    5. Dim CurrentControl = NumericUpDown1.Controls(0)
    6. Dim CurrentMousePosition = Cursor.Position
    7. TargetRectangle.Offset(AbsX, AbsY)
    8. Do Until CurrentControl Is Nothing
    9. TargetRectangle.Offset(CurrentControl.Location)
    10. CurrentControl = CurrentControl.Parent
    11. Loop
    12. If TargetRectangle.Contains(CurrentMousePosition) Then StopAndCryForHelp '<- bitte passende Anweisung hier einfügen
    13. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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

    Humax schrieb:

    Das sind ja die Werte die ich mit ... geprüft hatte.
    Dies sollte in Deinem Control nicht vorkommen :!:
    Sobald die Schriftgröße geändert wird, z.B. über den Pitch beim System, funktioniert da nix mehr.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    @Gonger96: Hast recht, hab erfolgreich Dein Snippet übersehen. Es ist natürlich sinnvoller, das ClickEvent des konkreten Spinnercontrols herzunehmen als zu berechnen, wo die Maus ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.