簡體   English   中英

顯示帶有派生的DateTimePicker類的自定義日歷下拉列表

[英]Show a custom calendar dropdown with a derived DateTimePicker class

我的目標是在.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);
}

您是否嘗試發送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月日歷和Datepicker

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM