如何在面板上捕获鼠标滚轮?

28
如何在C#中捕获面板上的鼠标滚轮事件?我正在使用WinForms
编辑:
我现在尝试在PictureBox上实现。
我的代码:
this.pictureBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick);    
this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick);
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)  
  {  
    MessageBox.Show("Click");  
  }

点击可以工作,滚轮不行。为什么?

5个回答

39

如果你在一个组件上看不到“MouseWheel”事件,那么你需要手动创建它。此外,我们需要将焦点集中在该组件上,否则“MouseWheel”事件将无法为该组件工作。我将向您展示如何为“pictureBox1”创建“MouseWheel”事件以及其工作原理。

  1. 在构造函数内,在该组件上创建一个鼠标滚轮事件。

InitializeComponent();
this.pictureBox1.MouseWheel += pictureBox1_MouseWheel;
  • 手动创建函数。按照我的示例,将其命名为"pictureBox1_MouseWheel"

  • private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
    {
        //you can do anything here
    }
    
  • 在该组件上创建MouseHover事件(转到PictureBox1中的属性,选择事件,找到“MouseHover”并双击“MouseHover”事件)。

  • 在MouseHover事件中调用“Focus()”方法。

  • pictureBox1.Focus();
    
  • 现在运行程序。


  • 1
    一个很棒的人!在我的情况下,我不需要 Mouse/Scroll EventArgs,所以我设置了 private void EventFunc(object sender, EventArgs e)。这样我就可以在同一个函数上设置两个处理程序(滚动和鼠标滚轮):)。简洁明了。 - C4d
    2
    这可能会导致非常意外的行为,如果您单击文本框或想要编辑其他内容,则会在悬停时将焦点放在面板上。我不会这样做。 - Denny
    1
    只是为了进一步说明,e.Delta 将通过正或负整数的方式返回滚轮的方向。 - Jim Simson

    22

    Windows会向获得焦点的控件发送WM_MOUSEWHEEL消息。但是Panel并不是一个能够获得焦点的控件,因此它不会接收到该消息。只要在面板上放置一个控件(例如按钮),那么该按钮将获得焦点并接收该消息。

    然而,该按钮对该消息没有用处,因为它没有需要滚动的内容。Windows会注意到这一点,并将消息发送给父控件,也就是面板,从而使其滚动。

    您可以在此答案中找到一个自定义的面板代码,该面板可以获得焦点。


    更新:请注意,这种行为在Windows 10中已经发生了改变。新的“当我悬停在非活动窗口上时滚动”选项默认已打开。这使得鼠标滚轮的行为更加与浏览器或办公程序的工作方式一致。在这种特定情况下,PictureBox现在会接收到该事件。请注意。


    请参考这个有关如何使用面板的答案:https://dev59.com/LXI-5IYBdhLWcg3w8dYQ#9086750 - Eugene Ryabtsev

    8

    如果需要手动连接它...

    this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);
    
    private void panel1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        ///process mouse event
    }
    

    更简单的方法是在Visual Studio中单击面板,转到属性视图面板,选择事件,定位并双击“mousewheel”事件。

    3
    我无法看到鼠标滚轮。有MouseCaptureChanged,MouseClick,MouseDoubleClick,MouseDown,MouseEnter,MouseHover,MpouseLeave,MouseMove,MouseUp。 - Miko Kronn
    1
    很奇怪,你说得对。不确定为什么Visual Studio没有列出它。如果你手动连接它,它就可以工作。这是一个使用MouseWheel事件的示例程序。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousewheel.aspx - Gerald Davis
    2
    值得一提的是,它不会出现在属性视图面板中,因为此事件的声明被装饰为“[Browsable(false)]”。此外,除非设置VS显示高级成员(我认为VB会隐藏这些,而C#默认情况下不会),否则它不会出现在IntelliSense的自动完成面板中 - 这是因为它还装饰有“[EditorBrowsable(EditorBrowsableState.Advanced)]”。 - C.B.
    @C.B. 你知道它被装饰的原因吗? - Ciprian Tomoiagă

    5

    1
    获取鼠标滚轮事件比较棘手。最简单的方法是使用 this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel); 而不是 this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel); 这样,窗体会接收到事件而不是控件。这种方式很容易,但有一个问题:你只能在窗体中使用一个鼠标滚轮事件。
    如果你有多个控件需要获取鼠标滚轮事件,最好的方法是参考 Shehan Silva - weltZ 的答案

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