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

我的目标是在.NET 2.0中创建一个自定义DateTimePicker类,它显示自定义日历下拉列表而不是Windows默认日历弹出窗口。

通过观察Windows消息(参见附件代码),我可以在创建后找到并隐藏/关闭日历窗口。

但是,问题仍然存在:关闭日历窗口后,某些内容仍然阻止鼠标输入。 例如,如果在以编程方式关闭日历下拉列表(附加代码)后尝试最大化自定义DateTimePicker控件的所有者表单,则“最大化”按钮不会响应。 只有下一次点击才有效。 有趣的是,“非function性点击”会触发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); } 

您是否尝试发送DTM_CLOSEMONTHCAL消息而不是发送WM_CLOSE ? 您可以将其发送到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) 

我终于找到了这个完全可自定义的datePicker(monthCalendar渲染是可覆盖的): CodeProject上的Culture Aware Month Calendar和Datepicker