Shift + колесо мыши горизонтальная прокрутка - PullRequest
8 голосов
/ 20 октября 2011

Использование Shift + колесо прокрутки довольно распространено для горизонтальной прокрутки.

Оба из них довольно легко захватить.Я могу использовать событие MouseWheel с флагом, установленным событиями KeyDown, KeyUp, чтобы отслеживать, когда нажата клавиша Shift.

Однако, как на самом деле запустить горизонтальную прокрутку?Мне известно о WM_MOUSEHWHEEL, может ли он использоваться для запуска события?

Обновление: для System.Windows.Form существует свойство HorizontalScroll, имеющее тип HScrollProperties.Вы можете манипулировать атрибутом Value этого объекта, чтобы изменить положение горизонтальной полосы прокрутки.Однако до сих пор я не обнаружил никаких других элементов управления, на которых доступен этот объект.

Ответы [ 3 ]

11 голосов
/ 27 июня 2012

Если вы создаете свой собственный элемент управления, полученный из UserControl или ScrollControl или Form, вы можете использовать это простое решение:

protected override void OnMouseWheel(MouseEventArgs e)
{
    if (this.VScroll && (Control.ModifierKeys & Keys.Shift) == Keys.Shift)
    {
        this.VScroll = false;
        base.OnMouseWheel(e);
        this.VScroll = true;
    }
    else
    {
        base.OnMouseWheel(e);
    }
}

Объяснение

Если элемент управления имеет AutoScroll и отображает полосы прокрутки, при прокрутке колеса мыши вы получите следующее поведение:

  1. Если полосы прокрутки не включены, это ничего не делает.
  2. Если включена только вертикальная полоса прокрутки, она прокручивает вертикальную полосу прокрутки.
  3. Если включена только горизонтальная полоса прокрутки, она прокручивает горизонтальную полосу прокрутки.
  4. Если включены вертикальная и горизонтальная полосы прокрутки, она прокручивает вертикальную полосу прокрутки.

Заметив такое поведение, я понял, что этот хак переопределяет OnMouseWheel элемента управления, затем, если активирована вертикальная полоса прокрутки и удерживается Shift , она отключает вертикальную полосу прокрутки перед вызовом base.OnMouseWheel , Это обманет элемент управления при прокрутке горизонтальной полосы прокрутки (поведение 3, как показано выше).

4 голосов
/ 20 октября 2011

В вашем файле дизайнера вам нужно будет вручную добавить делегат события MouseWheel.

this.richTextBox.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.RichTextBox_MouseWheel);

Затем в коде вы можете добавить следующее.

    private const int WM_SCROLL = 276; // Horizontal scroll 
    private const int SB_LINELEFT = 0; // Scrolls one cell left 
    private const int SB_LINERIGHT = 1; // Scrolls one line right

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); 

    private void RichTextBox_MouseWheel(object sender, MouseEventArgs e)
    {
        if (ModifierKeys == Keys.Shift)
        {
            var direction = e.Delta > 0 ? SB_LINELEFT : SB_LINERIGHT;

            SendMessage(this.richTextBox.Handle, WM_SCROLL, (IntPtr)direction, IntPtr.Zero);
        }
    }

Для получения дополнительной информации о значениях констант см. Следующий документ SO: Как программно прокрутить элемент управления сетки данных winforms?

UPDATE

Используйте решение Элвина , если это возможно. Это намного лучше .

1 голос
/ 04 ноября 2011

Тот же код, что и xixonia в VB.NET

Private Const WM_SCROLL As Integer = 276 
Private Const SB_LINELEFT As Integer = 0 
Private Const SB_LINERIGHT As Integer = 1

<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function SendMessage(ByVal hWnd As IntPtr, 
                                    ByVal wMsg As UInteger,
                                    ByVal wParam As IntPtr, 
                                    ByVal lParam As IntPtr) As Integer
End Function

Private Sub RichTextBox_MouseWheel(ByVal sender As Object, ByVal e As MouseEventArgs) Handles RichTextBox1.MouseWheel

  If ModifierKeys = Keys.Shift Then
    Dim direction = If(e.Delta > 0, SB_LINELEFT, SB_LINERIGHT)
    SendMessage(Me.RichTextBox1.Handle, WM_SCROLL, CType(direction, IntPtr), IntPtr.Zero)
  End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...