代码之家  ›  专栏  ›  技术社区  ›  Ksempac

如何在鼠标滚轮上增加/减少DateTimePicker

  •  8
  • Ksempac  · 技术社区  · 16 年前

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

    有没有办法做到这一点?

    6 回复  |  直到 16 年前
        1
  •  14
  •   Doug Porter    11 年前

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

    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
  •  2
  •   Jiri    16 年前

    我也试着弄明白这一点。最后,我的结论是:

    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
    

     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
    
        3
  •  1
  •   Vozzie    15 年前

    使用发送消息WM\U KEYDOWN/WM\U 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
    
        4
  •  0
  •   Fiur    16 年前
       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

        5
  •  0
  •   ChrisF    16 年前

    如果你设定 ShowUpDown 属性设置为True时,将得到一个旋转框而不是下拉框,这将修改日期的突出显示部分。尽管我刚刚发现这是不相关的,因为上下箭头键会改变日期的突出显示部分,而不管该属性是否设置为true。

    如果你能找到这段代码,你应该也能让鼠标滚轮工作。我去看看能找到什么。

    更新:

    我刚找到这张关于 ShowCheckBox

    读/写。如果为true,则选中一个复选框 控件中的值。当这 复选框中的值 用户可以在以下位置更改控件: 通过突出显示 如果未选中,则只能选择日期 通过单击下拉菜单进行更改 以显示日历。默认为

    这有用吗?

    更新2:

        6
  •  0
  •   AB.    16 年前

    我不确定,但这个方向好吗。。

    不是很确定,月份的x坐标<x代表一天<datepicker控件中的年x(假定没有自定义格式),其沿递增的x轴显示

    然后,也许我们可以捕获dateTimePicker1\u MouseDown事件,并将我们在滚动前单击的x坐标设置为一个变量,比如:xCordOfClick,然后在Fiur的mousewheel代码中使用它,根据我们单击的位置和datepicker的x位置的差异递增。

    差不多

    在dateTimePicker1\u 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() );
        }
    
    推荐文章