none
MouseMove-Event löst teilweise unbegründet aus RRS feed

  • Frage

  • Hi,

     

    ich find's ziemlich merkwürdig, dass ich im Internet nur eine einzige Seite zu dem Thema gefunden habe, die auch das Problem auch nur halb beschreibt.

    Es ging mir eigentlich um einen DragDrop-Vorgang, bei dem ich aber festgestellt habe, dass merkwürdigerweise das MouseMove-Event auch beim Klicken ausgelöst (nein, ich habe die Maus nicht bewegt; habe nämlich ein Notebook und strikt darauf geachtet, dass ich das TouchPad nicht berühr : ) ). Interessant ist, dass das Event nur bei jedem zweiten Klick ausgeführt wird...

     

    Hier der Code (von diesem MSDN-HowTo http://msdn.microsoft.com/de-de/library/aa289508(VS.71).aspx

     

     Private MouseIsDown As Boolean = False
    
     Private Sub TextBox1_MouseDown(ByVal sender As Object, ByVal e As _ 
    System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDown 
     ' Set a flag to show that the mouse is down. 
     MouseIsDown = True 
     End Sub 
     Private Sub TextBox1_MouseMove(ByVal sender As Object, ByVal e As _ 
    System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseMove 
     If MouseIsDown Then 
     ' Initiate dragging. 
     TextBox1.DoDragDrop(TextBox1.Text, DragDropEffects.Copy) 
     End If 
     MouseIsDown = False 
     End Sub 
     Private Sub TextBox2_DragEnter(ByVal sender As Object, ByVal e As _ 
    System.Windows.Forms.DragEventArgs) Handles TextBox2.DragEnter 
     ' Check the format of the data being dropped. 
     If (e.Data.GetDataPresent(DataFormats.Text)) Then 
     ' Display the copy cursor. 
     e.Effect = DragDropEffects.Copy 
     Else 
     ' Display the no-drop cursor. 
     e.Effect = DragDropEffects.None 
     End If 
     End Sub 
     Private Sub TextBox2_DragDrop(ByVal sender As Object, ByVal e As _ 
    System.Windows.Forms.DragEventArgs) Handles TextBox2.DragDrop 
     ' Paste the text. 
     TextBox2.Text = e.Data.GetData(DataFormats.Text) 
    End Sub
    

     

    Klickt man jetzt auf die erste TextBox passiert das was passieren soll: nichts.

    Macht man das aber ein zweites Mal, wird kurz (ist ja nur 'n Klick) der "Hier kann man nicht droppen"-Cursor angezigt.

    Hat das noch nie einer bemerkt und bin ich einfach nur gerade ein bisschen doof?

    Ich habe es im Übrigen jetzt so gemacht, dass ich einfach gucke ob sich die Position verändert hat,  aber es würde mich doch interessieren, was ihr dazu sagt.

    Private IsMouseDown As Boolean = False
     Private MouseLocation As System.Drawing.Point
    
     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      TextBox2.AllowDrop = True
     End Sub
    
    
    
    
     Private Sub TextBox1_MouseDown(ByVal sender As Object, ByVal e As _
     System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseDown
      ' Set a flag to show that the mouse is down. 
      IsMouseDown = True
      MouseLocation = e.Location
     End Sub
     Private Sub TextBox1_MouseMove(ByVal sender As Object, ByVal e As _
     System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseMove
      If MouseLocation <> e.Location Then
       If IsMouseDown Then
        ' Initiate dragging. 
        TextBox1.DoDragDrop(TextBox1.Text, DragDropEffects.Copy)
       End If
       IsMouseDown = False
      End If
     End Sub
     Private Sub TextBox2_DragEnter(ByVal sender As Object, ByVal e As _
     System.Windows.Forms.DragEventArgs) Handles TextBox2.DragEnter
      ' Check the format of the data being dropped. 
      If (e.Data.GetDataPresent(DataFormats.Text)) Then
       ' Display the copy cursor. 
       e.Effect = DragDropEffects.Copy
      Else
       ' Display the no-drop cursor. 
       e.Effect = DragDropEffects.None
      End If
     End Sub
     Private Sub TextBox2_DragDrop(ByVal sender As Object, ByVal e As _
     System.Windows.Forms.DragEventArgs) Handles TextBox2.DragDrop
      ' Paste the text. 
      TextBox2.Text = e.Data.GetData(DataFormats.Text)
     End Sub
    
    

     

    Donnerstag, 28. Oktober 2010 17:02

Antworten

  • Hallo,

    ich find's ziemlich merkwürdig, dass ich im Internet nur eine einzige Seite zu dem Thema gefunden habe

    liegt vermutlich daran, dass es ein Standardverhalten unter Windows ist. Auch wenn ich das so nicht in der Dokumentation lesen kann.

    Es ging mir eigentlich um einen DragDrop-Vorgang, bei dem ich aber festgestellt habe, dass merkwürdigerweise das MouseMove-Event auch beim Klicken ausgelöst

    Genauer wird es beim Lösen der Maustaste einmalig gefeuert.

      Interessant ist, dass das Event nur bei jedem zweiten Klick ausgeführt wird...

    Das liegt am interessanten Code, der "vergisst", das "MouseIsDown" Flag wieder beim MouseUp zurückzusetzen. Damit ist die Bedingung einmal wahr und beim nächsten mal wieder falsch. Etwas weniger zufällig und mit Verzicht auf die Flag Variable

     Private Sub TextBox1_MouseMove(ByVal sender As Object, _
                     ByVal e As System.Windows.Forms.MouseEventArgs _
                        ) Handles TextBox1.MouseMove
    
      If e.Button = Windows.Forms.MouseButtons.Left Then
       TextBox1.DoDragDrop(TextBox1.Text, DragDropEffects.Copy)
      End If
    
     End Sub

    Wobei der Ansatz generell unschön ist und den Benutzer daran hindert den Text markieren zu können.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Donnerstag, 28. Oktober 2010 18:54
    Beantworter