Zeigen Sie ein benutzerdefiniertes Kalender-Dropdown-Menü mit einer abgeleiteten DateTimePicker-Klasse an
Mein Ziel ist es, eine benutzerdefinierte DateTimePicker-Klasse in .NET 2.0 zu erstellen, die anstelle des Windows-Standardkalender-Popups ein benutzerdefiniertes Kalender-Dropdown-Menü anzeigt.
Durch Beobachten von Windows-Meldungen (siehe angehängten Code) kann ich das Kalenderfenster nach der Erstellung suchen und ausblenden / schließen.
Es bleibt jedoch ein Problem: Nach dem Schließen des Kalenderfensters blockiert immer noch etwas die Mauseingabe. Wenn Sie beispielsweise versuchen, das Besitzerformular des angepassten DateTimePicker-Steuerelements zu maximieren, nachdem das Kalender-Dropdown-Menü programmgesteuert geschlossen wurde (angehängter Code), reagiert die Schaltfläche zum Maximieren nicht. Nur der nächste Klick funktioniert. Interessanterweise löst der "nicht funktionierende Klick" die DTN_CLOSEUP-Benachrichtigung aus, sodass der WM_CLOSE den Kalender anscheinend nicht ordnungsgemäß geschlossen hat.
Hinweise, wie ich meine Aufgabe erfüllen kann, sind sehr willkommen :)
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);
}