禁用/启用面板的鼠标滚轮滚动

时间:2015-02-05 08:38:10

标签: c# winforms scroll mousewheel

在我的WinForm中有一个面板有一些网格,网格也有滚动条。我想使用鼠标滚轮滚动每个网格,并使用Shift +滚动滚动面板。 试过这个:

private void sitePnlGrid_MouseWheel(object sender, MouseEventArgs e)
    {
                if (Control.ModifierKeys == Keys.Shift)
                   this.sitePnlGrid.DisableScroll = false;
                else
                   this.sitePnlGrid.DisableScroll = true;
    }

而且:

public class CustomScrollPanel : Panel
    {
        public bool DisableScroll { get; set; }
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x20a && DisableScroll==true) return; 
            base.WndProc(ref m);
        }
    }

在初始化中设置this.sitePnlGrid.DisableScroll = false;

这是禁用滚动但不启用它。我的意思是:如果我先按Shift +滚动,滚动工作在面板上。只做Scroll,它会禁用面板滚动,所以,我可以滚动网格。但是,如果我再次按Shift +滚动,则滚动面板不起作用。

如果面板禁用后如何启用面板?

1 个答案:

答案 0 :(得分:0)

[编辑]好的,我在这里留下我的代码。但事实是:这是一种标准行为,在鼠标滚动期间按下shift键会对父面板产生影响。没有其他事可做了。

这里应该有用。

缺点是您必须对要放在面板中的所有类型的组件进行此修改。

class MyDataGridView : DataGridView
{
    protected override void WndProc(ref Message m)
    {
        // If the message is for this component, is about mouse wheel
        // and if the shift key is pressed,
        // we transmit it to the parent control.
        // Otherwise, we handle it normally.
        if ((m.HWnd == Handle) && (m.Msg == WM_MOUSEWHEEL) && (ModifierKeys == Keys.Shift))
        {
            PostMessage(Parent.Handle, m.Msg, m.WParam, m.LParam);
        }
        else
        {
            base.WndProc(ref m);
        }
    }

    #region User32.dll
    [DllImport("User32.dll")]
    private static extern IntPtr PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

    private const int WM_MOUSEWHEEL = 0x020A;
    #endregion
}