如何在面板上捕获鼠标滚轮?
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"
【讨论】:
以上是关于如何在面板上捕获鼠标滚轮?的主要内容,如果未能解决你的问题,请参考以下文章