2014-02-28 22 views
1

我已经制作了一个带有流布局面板和多个动态生成的布局面板的程序。多流式布局面板panel.Focus()不起作用

现在我想滚动鼠标悬停在他们的子面板,但只是设置panel.Focus();面板不起作用。我需要点击面板,但面板上完全装满了可点击的项目。因此,如果我只是徘徊,我想让它成为焦点。

任何想法为什么panel.Focus()不起作用,或者你知道什么可能会导致此问题?

+0

面板不需要*重点,它没有用处。它不能指示焦点并且不处理键盘输入。所以如果它的孩子立即传给它。否则很不清楚你打算如何通过点击鼠标来滚动。点击滚动条,或使用鼠标滚轮。如果您没有滚动条,那么您忘记将AutoScroll属性设置为True。 –

+0

我得到了一个滚动条,只是想设置当前面板滚动 – WebFreak001

回答

0

Hope Hans'原谅我,但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; 
    } 
} 
+0

是的工作:)谢谢 – WebFreak001