Отключить / включить прокрутку колеса мыши для панели

В моей WinForm есть панель с некоторыми сетками, у сеток тоже есть полоса прокрутки. Я хотел прокрутить каждую сетку с помощью колеса мыши и прокрутить панель с помощью Shift + scroll. Пробовал это:

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 + прокрутку, прокрутка на панели не будет работать.

Как включить прокрутку панели назад, если она отключена?


person M.K    schedule 05.02.2015    source источник


Ответы (1)


[EDIT] Хорошо, я оставляю здесь свой код. Но факт в том, что это стандартное поведение, когда нажатие клавиши 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
}
person Orace    schedule 05.02.2015