[英]How to make a DateTimePicker increment/decrement on mouse wheel
添加DateTimePicker控件時,可以選擇控件值的一部分(例如月份),然后使用向上/向下箭頭修改日期/時間值的這一部分(例如,遞增/遞減月份)。
我想做的是用鼠標滾輪允許相同的事情。 我試圖在MouseWheel事件上注冊,但我找不到方法知道我的日期/時間的哪一部分當前被選中,所以我無法知道我是否應該增加時間,日期,月份或者年。
有沒有辦法做到這一點?
一個可能但不太優雅的解決方案是:
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事件)
我也試圖想出這個。 最后,我最終得到了這個:
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
使用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
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
如果將ShowUpDown
屬性設置為True,則會獲得一個旋轉框而不是下拉框,這會修改日期的突出顯示部分。 雖然我剛剛發現這是無關緊要的,因為向上和向下箭頭鍵會改變日期的突出顯示部分,無論此屬性是否設置為true。
如果你能找到這個代碼,你應該能夠讓鼠標滾輪工作。 我會看一看,看看能找到什么。
更新:
我剛剛發現了關於ShowCheckBox
屬性的這個注釋:
讀/寫。 如果為true,則控件中日期時間值左側會顯示一個復選框。 選中此復選框后,用戶可以在運行時通過突出顯示日期的一部分並按箭頭鍵來更改控件中的值。 未選中時,只能通過單擊下拉菜單來更改日期以顯示日歷。 默認值為false。
這有用嗎?
更新2:
我無法找到任何處理DateTimePicker特定方面的代碼。 微軟是否不再將代碼發布到這些控件上?
我不確定,但這個方向有什么好處..
不確定,在datepicker控件中,x的月坐標<x表示<x表示年份(假設沒有自定義格式),因為它沿着x軸顯示
那么也許我們可以捕獲dateTimePicker1_MouseDown事件並設置我們在滾動到變量之前點擊的x坐標說:xCordOfClick,然后在Fiur的代碼中使用這個鼠標滾輪根據我們點擊的位置和x位置的差異來增加日期選擇器。
就像是
在dateTimePicker1_MouseDown中(對象發送者,MouseEventArgs e)
{
xCordOfClick = e.X;
}
在mousewheel事件中
{
//Do increment based on how far we clicked from the location of the control
// increment based on (xCordOfClick - dateTimePicker1.Location.X).ToString() );
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.