我的目标是在.NET 2.0中创建一个自定义DateTimePicker类,它显示自定义日历下拉列表而不是Windows默认日历弹出窗口。
通过观察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 :(得分: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)
答案 1 :(得分:0)
我终于找到了这个完全可自定义的datePicker(monthCalendar呈现可覆盖):Culture Aware Month Calendar and Datepicker on CodeProject