Как сделать увеличение / уменьшение DateTimePicker на колесе мыши - PullRequest
8 голосов
/ 22 июня 2009

Когда вы добавляете элемент управления DateTimePicker, вы можете выбрать часть значения элемента управления (например, месяц), а затем использовать стрелки вверх / вниз, чтобы изменить эту часть значения даты / времени (например, увеличивая / уменьшая значение месяц).

То, что я хотел бы сделать, это разрешить то же самое с колесом мыши. Я попытался зарегистрироваться на событие MouseWheel, но не могу найти способ узнать, какая часть моей даты / времени выбрана в настоящий момент, поэтому у меня нет возможности узнать, следует ли мне увеличивать время, день, месяц или год.

Есть ли способ сделать это?

Ответы [ 6 ]

12 голосов
/ 22 июня 2009

Возможное, но не совсем элегантное решение будет выглядеть примерно так:

private void dateTimePicker1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
{
    if (e.Delta > 0) 
    {
        System.Windows.Forms.SendKeys.Send("{UP}");
    } 
    else 
    {
        System.Windows.Forms.SendKeys.Send("{DOWN}");
    }
}

это определенно должно работать в общем случае, но в некоторых угловых случаях могут быть неожиданные результаты (например, переопределение событий KeyUp / KeyDown)

2 голосов
/ 22 июня 2009

Я тоже пытался понять это. В итоге я закончил с этим:

Private Sub dtpDateTimePicker_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    If e.Delta > 0 Then
        SendKeys.Send("{Up}")
    Else
        SendKeys.Send("{Down}")
    End If
End Sub

Вы можете автоматически добавить этот обработчик для всех ваших средств выбора даты в вашей форме, и это контейнеры, используя этот метод. Просто позвоните один раз в form_load:

 Public Sub AttachDateTimeMouseWheels(ByRef ownerForm As Control)

    Dim myControl As Control        

    For Each myControl In ownerForm.Controls

        If TypeOf myControl Is DateTimePicker Then
            AddHandler myControl.MouseWheel, AddressOf dtpDateTimePicker_MouseWheel
        Else
            If myControl.Controls.Count > 0 Then
                AttachDateTimeMouseWheels(myControl)
            End If
        End If

    Next

End Sub
1 голос
/ 09 ноября 2010

Использовать sendmessage WM_KEYDOWN / WM_KEYUP

    Private Sub DateTimePickerAlarm_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DateTimePickerAlarm.MouseWheel
        If e.Delta > 0 Then
            Native.User32.SendMessage(DateTimePickerAlarm.Handle, &H100, Keys.Up, &H1480001)
            Native.User32.SendMessage(DateTimePickerAlarm.Handle, &H101, Keys.Up, &HC1480001)
        Else
            Native.User32.SendMessage(DateTimePickerAlarm.Handle, &H100, Keys.Down, &H1500001)
            Native.User32.SendMessage(DateTimePickerAlarm.Handle, &H101, Keys.Down, &HC1500001)
        End If
        'msg=0x100 (WM_KEYDOWN) hwnd=0x???????? wparam=0x26 lparam=0x01480001 result=0x0
        'msg=0x101 (WM_KEYUP)   hwnd=0x???????? wparam=0x26 lparam=0xc1480001 result=0x0
        'msg=0x100 (WM_KEYDOWN) hwnd=0x???????? wparam=0x28 lparam=0x01500001 result=0x0
        'msg=0x101 (WM_KEYUP)   hwnd=0x???????? wparam=0x28 lparam=0xc1500001 result=0x0
    End Sub
0 голосов
/ 22 июня 2009

Не уверен, но хорошо ли это направление ...

Не уверен ли, что координата x для месяца

тогда, возможно, мы сможем захватить событие dateTimePicker1_MouseDown и установить координату x, где мы щелкали перед прокруткой, в переменную, скажем: xCordOfClick, а затем использовать это в коде Fiur для колесика мыши для увеличения на основе разницы в том, где мы нажали х расположение даты выбора.

что-то вроде

In dateTimePicker1_MouseDown (отправитель объекта, MouseEventArgs e)

    {
        xCordOfClick  = e.X;
    }

В событии колесика мыши

    {   
        //Do increment based on how far we clicked from the location of the control   
      // increment based on (xCordOfClick   - dateTimePicker1.Location.X).ToString() );
    }
0 голосов
/ 22 июня 2009

Если вы установите для свойства ShowUpDown значение True, вы получите поле прокрутки, а не раскрывающийся список, и это изменит выделенную часть даты. Хотя я только что обнаружил, что это не имеет значения, поскольку клавиши со стрелками вверх и вниз изменяют выделенную часть даты независимо от того, установлено ли для этого свойства значение true или нет.

Если вы сможете найти этот код, вы также сможете заставить колесо мыши работать. Я посмотрю и посмотрю, что я смогу найти.

UPDATE:

Я только что нашел это примечание о свойстве ShowCheckBox:

Чтение / запись. Если это правда, флажок отображается слева от даты и времени значение в контроле. Когда это флажок, значения в пользователь может изменить управление время выполнения, выделив часть дата и нажатие клавиш со стрелками. Если не отмечено, дата может быть только изменено, нажав раскрывающееся меню для отображения календаря. По умолчанию ложь.

Это какая-то польза?

ОБНОВЛЕНИЕ 2:

Мне не удалось найти какой-либо код, который касается этого конкретного аспекта DateTimePicker. Разве Microsoft больше не выпускает код для таких элементов управления?

0 голосов
/ 22 июня 2009
   dateTimePicker1.MouseWheel +=  new MouseEventHandler(dateTimePicker1_MouseWheel);

    private void dateTimePicker1_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        int incrementValue = SystemInformation.MouseWheelScrollLines;
        //Do increment
    }

Ссылка: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousewheel.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...