Left und right Mouseclick abfangen

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

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Left und right Mouseclick abfangen

    Hi,

    ich habe eine Anwendung, die recht speziell ist. Sie heißt "Clock" und dient dazu den Wochentag und die sekundengenaue Zeit für mehrere Zeitzonen anzuzeigen. Das ist für mich eine sehr nützliche Anwendung, weil ich mit Leuten zu tun habe, die auf der ganzen Welt verstreut arbeiten.

    frmClock, hat nur Label: lblWeekday1, lblTime1, lblWeekday2, lblTime2 ... etc. Angezeigt wird die Form in der rechten unteren Ecke des Bildschirms mit borderstyle = none.

    MIt einem (Links)Click, soll frmClock minimiert werden (dann wird auch der Timer angehalten - wird die Form wieder angezeigt, läuft auch der Timer weiter).

    Mit einem Rechtsclick soll ein neues Fenster (frmOptions) geöffnet werden. Da kann man dann die gewünschte Zeitzonen auswählen oder eine Stoppuhr starten, etc. ...

    Ich hoffe, ich habe meine Anwendung verständlich machen können.

    Leider hab ich es bisher nicht geschafft, die Steuerung des Dialogs "user friendly" zu gestalten.

    HIer meine Versuche:

    VB.NET-Quellcode

    1. Private Sub frmClock_Click(sender As Object, e As System.EventArgs) Handles Me.Click
    2. Me.WindowState = FormWindowState.Minimized
    3. End Sub
    4. Private Sub lblTime1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles lblTime1.MouseDown
    5. If e.Button = Windows.Forms.MouseButtons.Right Then
    6. 'Show option menue
    7. ...


    Mit einem "rechts-Click" auf lblTime1 kriege ich mein Options Menue ... mit einem "linkls-Click" auf einen freien Form Bereich wird die Clock minimiert.

    Aber das soll halt ÜBERALL auf der Form so sein!

    rechts-Click = show frmOption
    links-Click = Minimize frmClock

    Natürlich kann ich das jetzt in entsprechenden Ereignisprozeduren für ALLE Label und die Form so kodieren. Aber das scheint mir ein bissl umständlich.

    Kann mir jemand sagen, ob, man das eleganter hinbekommen kann?

    LG
    Peter

    Peter329 schrieb:

    MIt einem (Links)Click ...
    Mit einem Rechtsclick ...
    Ichj würde da ein ContextMenu nehmen, da kannst Du per Klartext reinschreiben, was passieren 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).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Peter329
    Aber das soll halt ÜBERALL auf der Form so sein!

    Meinst du so etwas...

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles MyBase.MouseClick
    3. If e.Button = MouseButtons.Left Then MessageBox.Show("Links: 'Minimize Clock'")
    4. If e.Button = MouseButtons.Right Then MessageBox.Show("Rechts: 'Show Options'")
    5. End Sub
    6. End Class

    Man braucht zwar Clicks weniger - ist aber ungewöhnlich. Da täte ich auch ein Kontextmenü bevorzugen...
    das Prob ist, Mausklicks kommen auf dem Form nicht an, wenn Labels drauf sind.
    Es führt also nix drumrum, alle Controls durchzugehen, und deren Mausklick-Events auf einen gemeinsamen Handler zu leiten.

    Alternativ ebenso alle Controls durchgehen, und stattdessen jedem dasselbe ContextMenu zuweisen.
    Letzteres find ich auch besser, und bei nicht so viele ist das auch im Designer zu schaffen.

    ErfinderDesRades schrieb:

    das Prob ist, Mausklicks kommen auf dem Form nicht an, wenn Labels drauf sind.


    Genau ... daran hab ich mir nämlich die Zähne ausgebissen. Und deswegen klappt die Lösung von vb1963 wohl auch nicht!

    Aber danke erst mal für eure Ratschläge. Ich habe jetzt versucht die Sache mit einem ContextMenu zu lösen. Ich habe einen ContextMenuStrip1 eingefügt und das Label lblTime2 damit verbunden.

    VB.NET-Quellcode

    1. Private Sub ContextMenuStrip1_Opening(sender As System.Object, e As System.ComponentModel.CancelEventArgs) Handles ContextMenuStrip1.Opening
    2. Debug.Print("hello")
    3. End Sub


    Das klappt prima, hello wird ausgegeben wenn man das Label lblTime2 mit der RECHTEN Maustaste anklickt. Damit könnte ich die Sache mit dem Anzeigen der frmOption abhandeln.

    Wenn man mit der LINKEN Maustaste klickt, passiert natürlich nix. Deshalb hab ich das wie folgt versucht:

    VB.NET-Quellcode

    1. Private Sub ContextMenuStrip1_MouseClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ContextMenuStrip1.MouseClick
    2. Debug.Print("hello left / right")
    3. If e.Button = Windows.Forms.MouseButtons.Right Then Debug.Print("Right click")
    4. If e.Button = Windows.Forms.MouseButtons.Left Then Debug.Print("Left click")
    5. End Sub


    Das klappt aber nicht. Die Ereignisroutine wird nicht angesprungen, egal wie ich das Label anklicke! Es ist zum Auswachsen!

    Irgendwas mache ich da falsch ! Könnt ihr mir noch mal helfen?

    LG
    Peter

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

    Das ist garnet vorgesehen, dass ein ContextMenu Klickse empfängt.

    Es ist auch unüblich, Controlse auf Links-Klickse reagieren zu lassen.

    mach doch einfach die MenuItems die du brauchst ins Contextmenu und fertig. Auch das Opening-Event brauchst du nicht.

    Mach mw. 3 MenuItems rein, und jedes MenuItem ist ein MenuItem, d.h., hat ein Klick-Event.

    Peter329 schrieb:

    Die Ereignisroutine wird nicht angesprungen
    Du kannst das KontextMenu im Designer mehreren Controls zuweisen und feddich.
    Um mehr musst Du Dich nicht kümmern, natürlich musst Du die Prozeduren implementieren.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Befehl1ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles Befehl1ToolStripMenuItem.Click
    3. MessageBox.Show("Befehl 1")
    4. End Sub
    5. Private Sub Befehl2ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles Befehl2ToolStripMenuItem.Click
    6. MessageBox.Show("Befehl 1")
    7. End Sub
    8. End Class

    VB.NET-Quellcode

    1. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    2. Partial Class Form1
    3. Inherits System.Windows.Forms.Form
    4. 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
    5. <System.Diagnostics.DebuggerNonUserCode()> _
    6. Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    7. Try
    8. If disposing AndAlso components IsNot Nothing Then
    9. components.Dispose()
    10. End If
    11. Finally
    12. MyBase.Dispose(disposing)
    13. End Try
    14. End Sub
    15. 'Wird vom Windows Form-Designer benötigt.
    16. Private components As System.ComponentModel.IContainer
    17. 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
    18. 'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
    19. 'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
    20. <System.Diagnostics.DebuggerStepThrough()> _
    21. Private Sub InitializeComponent()
    22. Me.components = New System.ComponentModel.Container()
    23. Me.Label1 = New System.Windows.Forms.Label()
    24. Me.Label2 = New System.Windows.Forms.Label()
    25. Me.Label3 = New System.Windows.Forms.Label()
    26. Me.ContextMenuStrip1 = New System.Windows.Forms.ContextMenuStrip(Me.components)
    27. Me.Befehl1ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
    28. Me.Befehl2ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
    29. Me.ContextMenuStrip1.SuspendLayout()
    30. Me.SuspendLayout()
    31. '
    32. 'Label1
    33. '
    34. Me.Label1.AutoSize = True
    35. Me.Label1.ContextMenuStrip = Me.ContextMenuStrip1
    36. Me.Label1.Location = New System.Drawing.Point(31, 33)
    37. Me.Label1.Name = "Label1"
    38. Me.Label1.Size = New System.Drawing.Size(39, 13)
    39. Me.Label1.TabIndex = 0
    40. Me.Label1.Text = "Label1"
    41. '
    42. 'Label2
    43. '
    44. Me.Label2.AutoSize = True
    45. Me.Label2.ContextMenuStrip = Me.ContextMenuStrip1
    46. Me.Label2.Location = New System.Drawing.Point(31, 58)
    47. Me.Label2.Name = "Label2"
    48. Me.Label2.Size = New System.Drawing.Size(39, 13)
    49. Me.Label2.TabIndex = 1
    50. Me.Label2.Text = "Label2"
    51. '
    52. 'Label3
    53. '
    54. Me.Label3.AutoSize = True
    55. Me.Label3.ContextMenuStrip = Me.ContextMenuStrip1
    56. Me.Label3.Location = New System.Drawing.Point(43, 95)
    57. Me.Label3.Name = "Label3"
    58. Me.Label3.Size = New System.Drawing.Size(39, 13)
    59. Me.Label3.TabIndex = 2
    60. Me.Label3.Text = "Label3"
    61. '
    62. 'ContextMenuStrip1
    63. '
    64. Me.ContextMenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.Befehl1ToolStripMenuItem, Me.Befehl2ToolStripMenuItem})
    65. Me.ContextMenuStrip1.Name = "ContextMenuStrip1"
    66. Me.ContextMenuStrip1.Size = New System.Drawing.Size(114, 48)
    67. '
    68. 'Befehl1ToolStripMenuItem
    69. '
    70. Me.Befehl1ToolStripMenuItem.Name = "Befehl1ToolStripMenuItem"
    71. Me.Befehl1ToolStripMenuItem.Size = New System.Drawing.Size(113, 22)
    72. Me.Befehl1ToolStripMenuItem.Text = "Befehl1"
    73. '
    74. 'Befehl2ToolStripMenuItem
    75. '
    76. Me.Befehl2ToolStripMenuItem.Name = "Befehl2ToolStripMenuItem"
    77. Me.Befehl2ToolStripMenuItem.Size = New System.Drawing.Size(113, 22)
    78. Me.Befehl2ToolStripMenuItem.Text = "Befehl2"
    79. '
    80. 'Form1
    81. '
    82. Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
    83. Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    84. Me.ClientSize = New System.Drawing.Size(284, 262)
    85. Me.ContextMenuStrip = Me.ContextMenuStrip1
    86. Me.Controls.Add(Me.Label3)
    87. Me.Controls.Add(Me.Label2)
    88. Me.Controls.Add(Me.Label1)
    89. Me.Name = "Form1"
    90. Me.Text = "Form1"
    91. Me.ContextMenuStrip1.ResumeLayout(False)
    92. Me.ResumeLayout(False)
    93. Me.PerformLayout()
    94. End Sub
    95. Friend WithEvents Label1 As System.Windows.Forms.Label
    96. Friend WithEvents Label2 As System.Windows.Forms.Label
    97. Friend WithEvents Label3 As System.Windows.Forms.Label
    98. Friend WithEvents ContextMenuStrip1 As System.Windows.Forms.ContextMenuStrip
    99. Friend WithEvents Befehl1ToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
    100. Friend WithEvents Befehl2ToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
    101. 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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke erst mal für eure Ratschläge. Obwohl ich offen gestehen muss, dass ich einiges nicht so richtig nachvollziehen konnte.

    Ich habe die Sache jetzt elementar gelöst. Auf die Form und die Label habe ich jeweils eine MouseClick Ereignisprozedur definiert. Und die rufen eine gemeinsame Prozedur zum Verarbeiten auf.

    VB.NET-Quellcode

    1. Private Sub Form_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown
    2. ProcessMouseDown(e.Button)
    3. End Sub
    4. Private Sub lblWeekday1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles lblWeekDay1.MouseDown
    5. ProcessMouseDown(e.Button)
    6. End Sub
    7. Private Sub lblTime1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles lblTime1.MouseDown
    8. ProcessMouseDown(e.Button)
    9. End Sub
    10. Private Sub lblWeekday2_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles lblWeekDay2.MouseDown
    11. ProcessMouseDown(e.Button)
    12. End Sub
    13. Private Sub lblTime2_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles lblTime2.MouseDown
    14. ProcessMouseDown(e.Button)
    15. End Sub
    16. ...
    17. Private Sub ProcessMouseDown(intLeftRight As Integer)
    18. 'Left MouseClick
    19. If intLeftRight = Windows.Forms.MouseButtons.Left Then
    20. 'Minimize frmClock
    21. Me.WindowState = FormWindowState.Minimized
    22. End If
    23. 'Right MouseClick
    24. If intLeftRight = Windows.Forms.MouseButtons.Right Then
    25. 'Show option menue
    26. ...


    Das funktioniert jetzt hervorragend ... auch wenn ich eine lange Liste mit stereotypen Definitionen benötige. In der Not frisst der Teufel halt Fliegen! :)

    Meines Erarchtens liegen solche Probleme darin begründet, dass man in VB.Net für gleichartige Controls keine Wiederholungsgruppe definieren kann. Sonst könnte man solche Sachen über einen Index abwickeln.

    Wie immer Dank für eure Ratschläge!

    LG
    Peter
    ja, und da bietet VB eine ganz fabelhafte Möglichkeit, zu formulieren:

    VB.NET-Quellcode

    1. Private Sub Form_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown, lblWeekDay1.MouseDown, lblTime1.MouseDown, lblWeekDay2.MouseDown, lblTime2.MouseDown
    2. ProcessMouseDown(e.Button)
    3. End Sub


    Nach wie vor favorisiere ich aber ein konventionelles Kontextmenü

    Peter329 schrieb:

    Obwohl ich offen gestehen muss, dass ich einiges nicht so richtig nachvollziehen konnte.
    Also wenn du dein Tool zippst und anhängst, kann ichs dir da eben einbasteln.


    Um den Code zu "verkürzen" wäre so was möglich.
    Hier könntest du dann noch überlegen ob die eigene Sub notwenidig ist oder ob du das direkt im Aufruf löst.

    VB.NET-Quellcode

    1. Private Sub Form_MouseDown(sender As Object, e As MouseEventArgs) Handles MyBase.MouseDown, lblWeekDay1.MouseDown , lblWeekDay2.MouseDown, lblTime1.MouseDown, lblTime2.MouseDown
    2. ProcessMouseDown(e.Button)
    3. End Sub
    4. ...
    5. Private Sub ProcessMouseDown(intLeftRight As Integer)
    6. 'Left MouseClick
    7. If intLeftRight = Windows.Forms.MouseButtons.Left Then
    8. 'Minimize frmClock
    9. Me.WindowState = FormWindowState.Minimized
    10. End If
    11. 'Right MouseClick
    12. If intLeftRight = Windows.Forms.MouseButtons.Right Then
    13. 'Show option menue
    14. ...
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Supi! Das war mir neu, dass man eine LISTE in der Handles-Clause verwenden kann.

    Und natürlich hat Schamash recht, dass ich dann zum Verarbeiten keine eigene Prozedur mehr benötige, sondern das direkt in die Ereignisprozedur aufnehmen kann.

    Das gefällt mir jetzt. So bleibt die Kiste! :)

    Danke nochmal an alle!

    LG
    Peter