gpt4 book ai didi

c# - 用户控件 : How to add MouseWheel Listener?

转载 作者:行者123 更新时间:2023-11-30 13:33:25 25 4
gpt4 key购买 nike

我正在创建一个 UserControl,它应该在鼠标悬停在控件上并且 MouseWheel 旋转时使用react。

目前我正在这样做,如下所示:

    public MyUserControl()
{
this.MouseWheel += new MouseEventHandler(MouseWheelHandler);
}

private void MouseWheelHandler(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Delta > 0)
incIndex();

if (e.Delta < 0)
decIndex();
}

protected override void OnMouseEnter(EventArgs e)
{
this.Focus();

base.OnMouseEnter(e);
}

事实上这工作正常,但问题是“this.Focus();”部分因为它破坏了我的表单/应用程序行为。

有没有更好的方法来实现这一目标?

最佳答案

有同样的问题,我最终实现了@Paul_Westcott 和@nr1 的混合解决方案。这是一个类似于@Paul_Westcott 的解决方案的本地解决方案(仅适用于订阅的 winforms 控件)。它是多显示器安全和 MDI 安全的(与应用程序中的其他窗口重叠)

public static class MouseWheelHandlerForWinformsControl
{
private class MouseWheelMessageFilter : IMessageFilter
{
[DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(Point pt);

private readonly Control mCtrl;
private readonly Action<MouseEventArgs> mOnMouseWheel;

public MouseWheelMessageFilter(Control ctrl, Action<MouseEventArgs> onMouseWheel)
{
mCtrl = ctrl;
mOnMouseWheel = onMouseWheel;
}

public bool PreFilterMessage(ref Message m)
{
// handle only mouse wheel messages
if (m.Msg != 0x20a)
return false;

Point mouseAbsolutePosition = new Point(m.LParam.ToInt32());
Point mouseRelativePosition = mCtrl.PointToClient(mouseAbsolutePosition);

IntPtr hControlUnderMouse = WindowFromPoint(mouseAbsolutePosition);
Control controlUnderMouse = Control.FromHandle(hControlUnderMouse);

if (controlUnderMouse != mCtrl)
return false;

MouseButtons buttons = GetMouseButtons(m.WParam.ToInt32());
int delta = m.WParam.ToInt32() >> 16;

var e = new MouseEventArgs(buttons, 0, mouseRelativePosition.X, mouseRelativePosition.Y, delta);

mOnMouseWheel(e);

return true;
}

private static MouseButtons GetMouseButtons(int wParam)
{
MouseButtons buttons = MouseButtons.None;

if(HasFlag(wParam, 0x0001)) buttons |= MouseButtons.Left;
if(HasFlag(wParam, 0x0010)) buttons |= MouseButtons.Middle;
if(HasFlag(wParam, 0x0002)) buttons |= MouseButtons.Right;
if(HasFlag(wParam, 0x0020)) buttons |= MouseButtons.XButton1;
if(HasFlag(wParam, 0x0040)) buttons |= MouseButtons.XButton2;

return buttons;
}

private static bool HasFlag(int input, int flag)
{
return (input & flag) == flag;
}
}

public static void MemorySafeAdd(Control ctrl, Action<MouseEventArgs> onMouseWheel)
{
if (ctrl == null || onMouseWheel == null)
throw new ArgumentNullException();

var filter = new MouseWheelMessageFilter(ctrl, onMouseWheel);
Application.AddMessageFilter(filter);
ctrl.Disposed += (s, e) => Application.RemoveMessageFilter(filter);
}
}

将此帮助程序类添加到您的解决方案后,您可以在一行中将控件 myControl 订阅到鼠标滚轮,如下所示:

public void Init() {
MouseWheelHandlerForWinformsControl.MemorySafeAdd(myControl, OnMouseWheelEvent);
}

void OnMouseWheelEvent(MouseEventArgs args) {
// do what you need here
}

关于c# - 用户控件 : How to add MouseWheel Listener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7852824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com