2015-02-05 4 views
0

내 WinForm에는 일부 그리드가있는 패널, 그리드에도 스크롤 막대가 있습니다. 마우스 휠을 사용하여 각 그리드를 스크롤하고 Shift + 스크롤을 사용하여 패널을 스크롤하려고했습니다.패널의 마우스 휠 스크롤을 사용 또는 사용하지 않음

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

그리고이 : 초기화에 this.sitePnlGrid.DisableScroll = false;을 설정

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); 
     } 
    } 

이 시도.

스크롤을 비활성화했지만 다시 활성화하지는 않습니다. 내 말은 : Shift + 스크롤을 먼저하면 스크롤이 패널에서 작동합니다. 스크롤 만하면 패널 스크롤을 사용할 수 없으므로 그리드를 스크롤 할 수 있습니다. 하지만 Shift + 스크롤을 다시하면 패널의 스크롤이 작동하지 않습니다.

패널 스크롤을 사용하지 않도록 설정하려면 어떻게해야합니까?

답변

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 
} 
관련 문제