【问题标题】:Scrolling windows form on mousewheel在鼠标滚轮上滚动窗口窗体
【发布时间】:2014-08-14 12:54:45
【问题描述】:

我有带有垂直滚动条的窗口窗体,用户可以正常上下滚动,同时选择不处理 WM_MOUSEWHEEL 的控件,因为窗体本身会处理该事件,因此滚动效果很好。

但是,例如,当我选择多行文本框时,我无法在鼠标滚轮上滚动表单,因为WM_MOUSEWHEEL 由多行文本框处理。我在 StackOverflow 上找到了这个解决方案,效果很好:

public bool PreFilterMessage(ref Message m)
{
    if (m.Msg == 0x020a)
    {
        NativeMethods.SendMessage(this.Handle, m.Msg, m.WParam, m.LParam);
        return true;
    }
    return false;
}

internal class NativeMethods
{
    [DllImport("user32.dll")]
    public static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam);
}

无论关注哪个子控件,表单都会在鼠标滚轮事件上上下滚动,但我的老板不想使用此解决方案,因为他担心它可能会以某种方式在另一台具有不同 Windows 或其他东西的 PC 上崩溃。无论如何,如果我可以在用户点击表单时从子控件中移除焦点,我会很满意,所以我尝试了这个:

private void MyWindowsForm_MouseDown(object sender, MouseEventArgs e)
{
    this.Focus();
}

它不起作用,因为焦点自动设置到窗体上的第一个子控件。

我的问题是:“当用户点击表单时,有什么方法可以从子控件中移除焦点,以便我可以正常使用鼠标滚轮滚动我的表单?”

希望你能理解我想要做什么。提前致谢!

【问题讨论】:

  • 您的代码不会崩溃。但是你也可以只传递车轮信息:textBox1.MouseWheel += (sender, e) => { base.OnMouseWheel(e); };
  • @LarsTech 这个解决方案也有效!非常感谢! :D

标签: c# winforms mousewheel


【解决方案1】:

根据How to remove the focus from a TextBox in WinForms?这里的建议,你可以用一个小技巧来达到这个效果。只需将焦点设置到您的表单中的Label 控件即可。 Label 控件无论是否有焦点看起来都一样,因此它看起来就像焦点没有设置在任何地方。该控件必须是可见的,但是,如果您的表单上没有任何标签,您可以添加一个带有空 Text 值的标签。这将使Form 看起来好像没有设置焦点。

编辑

正如您在评论中提到的,专注于特定控件会导致 Form 自动滚动以显示该控件,这在这种情况下是不需要的。但是,您可以使用Panel 控件(假设它的NamemyPanel),将Dock 属性设置为Fill(以便它覆盖整个表单),将AutoScroll 设置为true并将所有控件放入其中。然后,为了从任何控件中移除焦点,您可以编写 myPanel.Focus() 以将焦点设置在 Panel 本身上。我很快对此进行了测试,它似乎可以按预期工作。

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    相关资源
    最近更新 更多