带Picturebox的MouseWheel事件?

时间:2010-08-03 18:38:15

标签: winforms mousewheel

我想将鼠标悬停在图片框(或所有图片和主窗体)上,然后使用鼠标滚轮滚动。但是我没有运气。我写了pictureBox1.MouseWheel并检查delta。我为它设定了一个断点!= 0.到目前为止,无论我做了什么,我都无法做到。我也试过mousemove,但没有用。但是在if语句中有效。我永远无法让车轮上班。

如何使picturebox(或表单中的任何控件)调用mousewheel事件?

-edit- nevermind。我将事件添加到大多数时间都有事件的对象。它工作得很好。在我写这个问题之前,我不确定为什么我没有想到这一点。我仍然可以使用鼠标+滚轮解决方案。

5 个答案:

答案 0 :(得分:12)

Windows不会将鼠标滚动消息发送到悬停的控件,而是转到具有焦点的控件。你已经知道如何确定焦点。

由于浏览器和Office程序的工作方式,此行为变得不直观。你会在this thread的答案中找到改变这个的代码。请注意,它适用于您应用中的任何窗口。如果这是不合需要的,你必须在句柄值上添加过滤。


更新:在Win10中更改了此行为。它有一个名为“当我将鼠标悬停在它们上时滚动非活动窗口”的新系统设置,默认情况下处于启用状态。所以焦点不再重要,它现在的工作方式与它在浏览器中的行为非常相似。测试您的应用非常重要,您可以通过暂时禁用系统选项来查看旧版Windows上发生的情况。

答案 1 :(得分:1)

This answer解释了如何做到这一点。简而言之,在仅关注图片框的图片框上创建一个MouseEnter事件。然后图片框就会收到MouseWheel事件。

答案 2 :(得分:0)

这里的答案对我不起作用。 我将图片框放在一个可滚动的窗格中,为了正常运行,还有很多工作要做。

您需要做的是覆盖表单中的OnMouseWheel()功能。 在那里你得到了轮子事件,你必须检查鼠标是否在图片框内。但这还不够。想象一下,您在可滚动窗格内显示5000 x 5000像素的图像,该窗格仅显示图像的一小部分。然后你还必须检查鼠标是否在Pane及其所有父母身上。下面的代码独立于pictureBox的任何父控件的滚动条的滚动位置。

/// <summary>
/// This must be overridden in the Form because the pictureBox never receives MouseWheel messages
/// </summary>
protected override void OnMouseWheel(MouseEventArgs e)
{
    // Do not use MouseEventArgs.X, Y because they are relative!
    Point pt_MouseAbs = Control.MousePosition; 
    Control i_Ctrl = pictureBox;
    do
    {
        Rectangle r_Ctrl = i_Ctrl.RectangleToScreen(i_Ctrl.ClientRectangle);
        if (!r_Ctrl.Contains(pt_MouseAbs))
        {
            base.OnMouseWheel(e);
            return; // mouse position is outside the picturebox or it's parents
        }
        i_Ctrl = i_Ctrl.Parent;
    }
    while (i_Ctrl != null && i_Ctrl != this);

    // here you have the mouse position relative to the pictureBox if you need it
    Point pt_MouseRel = pictureBox.PointToClient(pt_MouseAbs);

    // Do your work here
    ....
}

答案 3 :(得分:0)

只需覆盖Form的MouseWheel并检查e.X和e.Y是否在PictureBox的位置区域之内

  protected override void OnMouseWheel(MouseEventArgs e)
    {
        if (e.X >= soundGraph.Location.X && e.X <= soundGraph.Location.X + soundGraph.Width
            &&
            e.Y >= soundGraph.Location.Y && e.Y <= soundGraph.Location.Y + soundGraph.Height)
        { // do what you have to
        }
        base.OnMouseWheel(e);
    }

答案 4 :(得分:0)

如果图片框不在表单中的0,0位置,这也将起作用。

' =====================================================================================
'  Windows10 has a new system setting 
'   named "Scroll inactive windows when I hover over them", turned on by default.
' -------------------------------------------------------------------------------------
'  The following correction does the same for Windows 8 / 7 / XP
' =====================================================================================
Protected Overrides Sub OnMouseWheel(ByVal e As MouseEventArgs)
    Dim p As Point
    p = pbox_Graph.PointToClient(Me.PointToScreen(e.Location))
    If pbox_Graph.ClientRectangle.Contains(p) Then
        pbox_TimeGraph_MouseWheel(Me, e)
    Else
        MyBase.OnMouseWheel(e)
    End If
End Sub