【发布时间】: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