我制作了一个带有流程布局面板的程序,以及该面板内部的多个动态生成的布局面板。
现在我想在鼠标悬停在子面板上时滚动它们,但只是将panel.Focus();
设置为面板不起作用。我需要在面板中单击,但面板完全填充了可点击的项目。所以如果我只是悬停,我想让它集中注意力。
为什么panel.Focus()不起作用的任何想法,或者你知道什么可能导致这个问题吗?
答案 0 :(得分:0)
希望汉斯'请原谅我,但是his code example通过实现IMessageFilter接口来监听轮子消息并将其转发到鼠标当前所在的可滚动控件上,从而做到了你想要的。无需使用Panel1.Focus();
:
public partial class Form1 : Form, IMessageFilter {
[DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(Point pt);
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
public Form1() {
InitializeComponent();
Application.AddMessageFilter(this);
}
public bool PreFilterMessage(ref Message m) {
if (m.Msg == 0x20a) {
Point pos = new Point(m.LParam.ToInt32());
IntPtr hWnd = WindowFromPoint(pos);
if (hWnd != IntPtr.Zero && hWnd != m.HWnd && Control.FromHandle(hWnd) != null) {
SendMessage(hWnd, m.Msg, m.WParam, m.LParam);
return true;
}
}
return false;
}
}