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

Posted

技术标签:

【中文标题】如何在面板上捕获鼠标滚轮?【英文标题】:How to capture mouse wheel on panel? 【发布时间】:2011-05-24 17:08:23 【问题描述】:

如何在 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");  
  

点击有效。惠灵没有。 为什么?

【问题讨论】:

【参考方案1】:

如果您在组件上看不到“MouseWheel”事件,则需要手动创建它。此外,我们需要关注该组件,否则“MouseWheel”事件将不适用于该组件。我将向您展示如何为“pictureBox1”创建一个“MouseWheel”事件以及它是如何工作的。

    在构造函数中,在该组件上创建鼠标滚轮事件。

    InitializeComponent();
    this.pictureBox1.MouseWheel += pictureBox1_MouseWheel;
    

    手动创建函数。根据我的例子,称之为“pictureBox1_MouseWheel”

    private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
    
        //you can do anything here
    
    

    在该组件上创建 MouseHover 事件(转到 PicureBox1 中的属性,选择事件,找到“MouseHover”并双击“MouseHover”事件)。

    调用“焦点()”;该 MouseHover 事件中的方法。

    pictureBox1.Focus();
    

    现在运行程序。

【讨论】:

我是个好人!就我而言,我不需要Mouse/Scroll EventArgs,所以我设置了private void EventFunc(object sender, EventArgs e)。这样我就可以在同一个函数上设置两个处理程序(滚动和鼠标滚轮):)。干净。 这可能会产生非常意想不到的行为,如果您单击文本框或想要编辑其他内容,如果您将鼠标悬停在面板上,这将聚焦面板。我不会这样做.. 只是为了在这一点上添加一些进一步的启发,e.Delta 将通过正或负 int 的方式返回滚轮的方向。【参考方案2】:

Windows 将 WM_MOUSEWHEEL 消息发送到具有焦点的控件。那不会是Panel,它不是一个可以获得焦点的控件。只要您在面板上放置一个控件,比如说一个按钮,那么该按钮就会获得焦点和消息。

但是按钮对消息没有用处,它没有什么可滚动的。 Windows 注意到这一点并将消息发送给父级。那是面板,现在它会滚动。

您会发现自定义面板的代码可以在this answer 中获得焦点。


更新:请注意,此行为在 Windows 10 中已更改。新的“当我将鼠标悬停在非活动窗口上时滚动”选项默认打开。这使鼠标滚轮的行为与其在浏览器或 Office 程序中的工作方式更加一致。在这种特定情况下,图片框现在获得该事件。请注意这一点。

【讨论】:

查看有关如何使用面板执行此操作的答案:***.com/a/9086750/1353187【参考方案3】:

手动连接...

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 中单击面板,转到属性视图面板,选择事件,定位并双击“鼠标滚轮”事件。

【讨论】:

我看不到鼠标滚轮。有 MouseCaptureChanged、MouseClick、MouseDoubleClick、MouseDown、MouseEnter、MouseHover、MpouseLeave、MouseMove、MouseUp 奇怪的是你是对的。不知道为什么 Visual Studio 没有列出它。如果您手动连接它,它可以工作。这是一个使用 MouseWheel 事件的示例程序。 msdn.microsoft.com/en-us/library/… Fwiw,它不会显示在“属性”视图面板中,因为此事件的声明用“[Browsable(false)]”装饰。此外,它不会出现在 IntelliSense 的自动完成面板中,除非 VS 设置为显示高级成员(我相信 VB 会隐藏这些,而 C# 默认情况下不会) - 这是因为它也被“[EditorBrowsable(EditorBrowsableState .Advanced)]". @C.B.你知道它被装饰成这样的任何原因吗?【参考方案4】:

在 Winforms 中,这是使用 Control.MouseWheel event 实现的

【讨论】:

【参考方案5】:

获取鼠标滚轮事件很棘手。最简单的方法是使用

this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

而不是

this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseWheel);

这样表单获取事件而不是控制。这种方法很简单,但有一个问题:您只能在表单中使用一个鼠标滚轮事件。

如果您有多个控件来获取鼠标滚轮事件,最好的方法是This answer by "Shehan Silva - weltZ"

【讨论】:

以上是关于如何在面板上捕获鼠标滚轮?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用鼠标滚轮滚动面板?

Javascript:捕获鼠标滚轮事件并且不滚动页面?

在Edge里鼠标滚轮一动,页面就前进或后退了。怎样取消这个功能?

如何让DbGrid支持鼠标滚轮滚动

centos7触屏鼠标滚轮

ulli鼠标滚轮水平滚动