我想将鼠标悬停在图片框(或所有图片和主窗体)上,然后使用鼠标滚轮滚动。但是我没有运气。我写了pictureBox1.MouseWheel并检查delta。我为它设定了一个断点!= 0.到目前为止,无论我做了什么,我都无法做到。我也试过mousemove,但没有用。但是在if语句中有效。我永远无法让车轮上班。
如何使picturebox(或表单中的任何控件)调用mousewheel事件?
-edit- nevermind。我将事件添加到大多数时间都有事件的对象。它工作得很好。在我写这个问题之前,我不确定为什么我没有想到这一点。我仍然可以使用鼠标+滚轮解决方案。
答案 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