gpt4 book ai didi

c# - 鼠标滚轮上的滚动窗体

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:39 24 4
gpt4 key购买 nike

我的Windows表单带有垂直滚动条,用户可以正常和向下滚动,而无法处理 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();
}

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

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

希望您能理解我正在尝试做的事情。提前致谢!

最佳答案

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

编辑

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

关于c# - 鼠标滚轮上的滚动窗体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24383623/

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