Показать пользовательский раскрывающийся список календаря с производным классом DateTimePicker - PullRequest
1 голос
/ 26 января 2010

Моя цель - создать собственный класс DateTimePicker в .NET 2.0, в котором вместо всплывающего календаря 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);
}

Ответы [ 2 ]

0 голосов
/ 21 апреля 2011

Я наконец нашел этот полностью настраиваемый DatePicker (рендеринг monthCalendar можно переопределить): Календарь месяца с учетом культуры и Datepicker в CodeProject

0 голосов
/ 26 января 2010

Вместо отправки WM_CLOSE вы пытались вместо этого отправить сообщение DTM_CLOSEMONTHCAL? Вы бы отправили это в HWND самого DateTimePicker, а не в дочернее окно. Согласно документации, макрос DateTime_CloseMonthCal отправляет это сообщение, и похоже, что вы хотите сделать.

Я также не думаю, что вам нужно будет использовать BeginInvoke для его отправки, если только у вас нет проблем с закрытием в той же отправке, что и раскрывающееся уведомление.

#define DTM_FIRST        0x1000
#define DTM_CLOSEMONTHCAL (DTM_FIRST + 13)
#define DateTime_CloseMonthCal(hdp) SNDMSG(hdp, DTM_CLOSEMONTHCAL, 0, 0)
...