鼠标滚轮上的滚动窗口窗体

本文关键字:滚动 窗口 窗体 鼠标 | 更新日期: 2023-09-27 18:09:59

我有窗口窗体垂直滚动条,用户可以正常上下滚动,而控件不处理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();
}

它不能工作,因为焦点被自动设置为窗体上的第一个子控件。

我的问题是:"当用户单击窗体时,是否有办法从子控件中删除焦点,以便我可以正常使用鼠标滚轮滚动窗体?"

希望你能理解我在努力做什么。提前感谢!

鼠标滚轮上的滚动窗口窗体

根据建议张贴在这里如何从WinForms文本框中移除焦点?你可以用一些小技巧来达到这个效果。只需将焦点设置为Label控件在您的表单。Label控件无论是否聚焦看起来都是一样的,所以它看起来像焦点没有设置在任何地方。控件必须是可见的,但是,如果您的表单上没有任何标签,您可以添加一个空的Text值。这将使Form看起来好像没有设置焦点。

编辑

正如您在评论中提到的,专注于特定控件会导致Form自动滚动以将该控件带入视图,这在本例中是不希望的。但是,您可以使用Panel控件(假设它的NamemyPanel),将Dock属性设置为Fill(这样它就覆盖了整个表单),将AutoScroll设置为true,并将所有控件放入其中。然后,为了从任何控件中删除焦点,您可以编写myPanel.Focus()以将焦点设置在Panel本身上。我很快测试了一下,它似乎像预期的那样工作。