当按下按钮并移动鼠标时,会触发哪个事件?

4
我需要一个在.NET Framework标准事件中不存在的事件。例如,左键按下时的鼠标移动事件。
我还需要改变一些行为。例如,我有一些按钮,当光标悬停在上面并且左键按下时,我想更改每个按钮的背景图像,但是当我单击其中一个按钮并按住左键时,当我移动鼠标时,其他按钮不会引发任何事件。
我该怎么做?如何创建新事件?如何改变行为?
感谢任何帮助。

6
这是WPF还是Windows Forms? - sindre j
1
我编辑了这个以修复你的英语错误。(希望这不会冒犯你——我只是想帮忙 :))。一旦管理员批准,修改将会显示出来。 - Brennan Vincent
@Brennan:我觉得你忘记了标题?不过,感谢你的编辑。 - Cody Gray
3个回答

8
您的问题在于当鼠标按下按钮时,该按钮会“捕获”鼠标并在按钮释放之前不会释放它,这意味着其他按钮不会接收到MouseMove事件。以下是一些代码(来自此处)可能会有所帮助:
 // Assuming all buttons subscribe to this event:
 private void buttons_MouseMove (object sender, MouseEventArgs e)
 {
   if (e.Button == System.Windows.Forms.MouseButtons.Left)
      {
       Control control = (Control) sender;
       if (control.Capture)
       {
          control.Capture = false;
       }
       if (control.ClientRectangle.Contains (e.Location)) 
       {
           Control.BackgroundImage = ...;
       }
    }
  }

3

MouseMove事件有一个叫做“Button”的属性,它告诉你哪个按钮被按下了。所以你只需要像这样做:

void panel1_MouseMove(Object sender, System::Windows::Forms::MouseEventArgs e) {

    if(e.Button = MouseButtons.Left){
        //Do what you want when mouse_move with left button pressed      
    }      
}

上面的代码没有经过测试,我也没有查找正确的属性拼写等信息,请在 IntelliSense / MSDN 中尝试一下。
你可以在 MSDN 中找到更多的信息: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousemove%28v=vs.71%29.aspx 至于第二个问题,可以尝试寻找适当的事件或覆盖 WindowProc-Event-Function,在那里可以监听窗口消息并获取所需的内容 - 更多的信息在这里提供:http://msdn.microsoft.com/en-us/library/ms633573%28v=VS.85%29.aspxhttp://www.pinvoke.net

0

这个例子(一个带有2个文本框的表单)通过在一个文本框上单击左键并在另一个文本框上释放鼠标来将文本框中的文本移动到另一个文本框中。如果您注释掉捕获部分,它将停止工作。

Public Class Form1
Dim MousebuttonIsPressed As Boolean = False
Dim TextboxWhereMouseDown As TextBox
Dim TextboxWhereMouseUp As TextBox
Private Sub Form1_mouseup(sender As Object, e As EventArgs) Handles MyBase.MouseUp
    MousebuttonIsPressed = False
End Sub
Private Sub Textbox_MouseDown(sender As TextBox, e As MouseEventArgs) Handles TextboxOne.MouseDown, TextboxTwo.MouseDown ' etc for each textbox involved
    TextboxWhereMouseDown = sender
    If e.Button = MouseButtons.Left Then
        MousebuttonIsPressed = True
    End If
End Sub
Private Sub Textbox_MouseUp(sender As TextBox, e As MouseEventArgs) Handles TextboxOne.MouseUp, TextboxTwo.MouseUp ' etc.
    TextboxWhereMouseUp = sender
    If Not (TextboxWhereMouseDown Is TextboxWhereMouseUp) Then
        TextboxWhereMouseUp.Text = TextboxWhereMouseDown.Text
        TextboxWhereMouseDown.Text = ""
    End If
    MousebuttonIsPressed = False
End Sub
Private Sub Textbox_MouseEnter(sender As TextBox, e As EventArgs) Handles TextboxOne.MouseEnter, TextboxTwo.MouseEnter ' etc
    If MousebuttonIsPressed Then
        TextboxWhereMouseUp = sender
    End If
End Sub
Private Sub Textbox_MouseMove(sender As TextBox, e As MouseEventArgs) Handles TextboxOne.MouseMove, TextboxTwo.MouseMove ' etc
    If (e.Button = System.Windows.Forms.MouseButtons.Left) Then
        Dim Contrl As Control = sender
        If Contrl.Capture Then
            If Not Contrl.ClientRectangle.Contains(e.Location) Then ' to allow selection of text
                Contrl.Capture = False
            End If
        End If
    End If
End Sub
End Class

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接