2010-01-26 59 views
1

我的目標是在.NET 2.0中創建自定義DateTimePicker類,該類顯示自定義日曆下拉列表而不是Windows默認日曆彈出窗口。使用派生的DateTimePicker類顯示自定義日曆下拉菜單

通過觀察Windows消息(請參閱附加代碼),我可以在創建後查找並隱藏/關閉日曆窗口。

但是,問題仍然存在:日曆窗口關閉後,某些內容仍然阻止了鼠標輸入。例如,如果您嘗試在以編程方式關閉日曆下拉列表後最大化自定義DateTimePicker控件的所有者窗體(附加代碼),則最大化按鈕不響應。只有下一次點擊纔有效。有趣的是,「非功能性點擊」觸發了DTN_CLOSEUP通知,因此看起來WM_CLOSE沒有正確關閉日曆。

如何完成我的任務任何提示的高度讚賞:)

protected override void WndProc(ref System.Windows.Forms.Message m) 
{ 
    if (m.Msg == (int)SYSMSG.WM_REFLECT + (int)SYSMSG.WM_NOTIFY) 
    { 
     NMHDR nmhdr = (NMHDR)m.GetLParam(typeof(NMHDR)); 
     switch (nmhdr.code) 
     { 
      case DTN_DROPDOWN: 
       // Hide window 
       IntPtr calHandle = FindWindow("SysMonthCal32", null); 
       SendMessage(calHandle, (int)SYSMSG.WM_SIZE, 0, SP.Convert.MakeLong(0, 0)); 

       this.BeginInvoke((MethodInvoker)delegate() 
       { 
        SendMessage(calHandle, (int)SYSMSG.WM_CLOSE, 0, 0); 
       }); 
       break; 
     } 

    } 

    base.WndProc(ref m); 
} 
+0

嗨,我在哪裏可以找到'DTN_DROPDOWN'實際消息的代碼?瀏覽網頁,但他們只提到名稱而不是代碼。謝謝。 – superfly71 2016-11-14 10:18:15

+0

沒關係我的問題在這裏得到了解答http://stackoverflow.com/questions/40587540/where-can-i-get-the-actual-message-codes-for-the-winform-datetimepicker-control – superfly71 2016-11-17 08:22:06

回答

0

而是發送WM_CLOSE你試圖發送一個DTM_CLOSEMONTHCAL消息,而不是?您可以將此發送給DateTimePicker本身的HWND而不是子窗口。根據文檔,DateTime_CloseMonthCal宏發送此消息,它看起來像你想要做的。

我也不認爲你需要使用BeginInvoke發送它,除非在下拉通知的同一分派中關閉它有一些問題。

#define DTM_FIRST  0x1000 
#define DTM_CLOSEMONTHCAL (DTM_FIRST + 13) 
#define DateTime_CloseMonthCal(hdp) SNDMSG(hdp, DTM_CLOSEMONTHCAL, 0, 0) 
+0

感謝您的提示,該消息正確關閉日曆。但是,鼠標捕獲問題依然存在,「this.Capture = false」不起作用。 – floele 2010-01-27 11:23:02