Mostrar um menu suspenso de calendário personalizado com uma classe DateTimePicker derivada
Meu objetivo é criar uma classe DateTimePicker personalizada no .NET 2.0, que mostra uma lista suspensa de calendário personalizada em vez do pop-up de calendário padrão do Windows.
Observando as mensagens do Windows (consulte o código em anexo), sou capaz de encontrar e ocultar / fechar a janela do calendário após a criação.
No entanto, um problema permanece: depois que a janela do calendário é fechada, algo ainda está bloqueando a entrada do mouse. Por exemplo, se você tentar maximizar o formulário do proprietário do controle DateTimePicker personalizado depois que o menu suspenso for fechado programaticamente (código anexado), o botão maximizar não responderá. Somente o próximo clique funciona. Curiosamente, o "clique não funcional" dispara a notificação DTN_CLOSEUP, portanto parece que o WM_CLOSE não fechou corretamente o calendário.
Todas as dicas sobre como realizar minha tarefa são muito apreciadas :)
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);
}