【问题标题】: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");  
  }

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

【问题讨论】:

    标签: c# .net winforms visual-studio-2010


    【解决方案1】:

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

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

      InitializeComponent();
      this.pictureBox1.MouseWheel += pictureBox1_MouseWheel;
      
    2. 手动创建函数。根据我的例子,称之为“pictureBox1_MouseWheel”

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

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

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

    【讨论】:

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

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

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

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


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

    【讨论】:

    【解决方案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"

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-11
        相关资源
        最近更新 更多