使用派生的DateTimePicker类显示自定义日历下拉菜单

问题描述:

我的目标是在.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://*.com/questions/40587540/where-can-i-get-the-actual-message-codes-for-the-winform-datetimepicker-control – superfly71 2016-11-17 08:22:06

而是发送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

我终于找到了这完全可定制的日期选择器(MONTHCALENDAR渲染覆盖-能):Culture Aware Month Calendar and Datepicker on CodeProject