鼠标滚轮上的滚动窗口窗体
本文关键字:滚动 窗口 窗体 鼠标 | 更新日期: 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
控件(假设它的Name
是myPanel
),将Dock
属性设置为Fill
(这样它就覆盖了整个表单),将AutoScroll
设置为true
,并将所有控件放入其中。然后,为了从任何控件中删除焦点,您可以编写myPanel.Focus()
以将焦点设置在Panel
本身上。我很快测试了一下,它似乎像预期的那样工作。