如何在鼠标滚轮上进行DateTimePicker递增/递减

时间:2009-06-22 09:07:51

标签: c# winforms

添加DateTimePicker控件时,可以选择部分控件值(例如月份),然后使用向上/向下箭头修改日期/时间值的这一部分(例如,递增/递减月)。

我想做的是用鼠标滚轮做同样的事情。我试图在MouseWheel事件上注册,但我找不到方法知道我的日期/时间的哪一部分当前被选中,所以我无法知道我是否应该增加时间,日期,月份或者年。

有没有办法做到这一点?

6 个答案:

答案 0 :(得分:12)

可能但不太优雅的解决方案是:

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事件)

答案 1 :(得分:2)

我也尝试过这个。最后,我最终得到了这个:

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

答案 2 :(得分:1)

使用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

答案 3 :(得分:0)

   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

答案 4 :(得分:0)

如果将ShowUpDown属性设置为True,则会获得一个旋转框而不是下拉框,这会修改日期的突出显示部分。虽然我刚刚发现这是无关紧要的,因为向上和向下箭头键会改变日期的突出显示部分,无论此属性是否设置为true。

如果你能找到这个代码,你应该能够让鼠标滚轮工作。我会看一看,看看能找到什么。

更新:

我刚刚发现了关于ShowCheckBox属性的说明:

  

的读/写。如果为true,则复选框为   显示在日期时间的左侧   控制中的价值。当这个   选中复选框,中的值   用户可以在以下更改控件   运行时突出显示的一部分   日期并按箭头键。   未选中时,日期只能是   单击下拉菜单更改   显示日历。默认是   假的。

这有用吗?

更新2:

我无法找到任何处理DateTimePicker特定方面的代码。微软是否不再将代码发布到这些控件上了?

答案 5 :(得分:0)

我不确定,但这个方向有什么好处。

不确定,月份的x坐标< x表示日期<在datepicker控件中x表示年份(假设没有自定义格式),因为它沿着x轴突出显示

那么也许我们可以捕获dateTimePicker1_MouseDown事件并设置我们在滚动到变量之前单击的x坐标说:xCordOfClick,然后在Fiur的代码中使用它来鼠标滚轮根据我们点击的位置和日期选择器的x位置。

类似

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