1

私の目標は、.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);
}
4

2 に答える 2

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)
于 2010-01-26T08:33:23.647 に答える
0

最終的に、この完全にカスタマイズ可能な datePicker (monthCalendar レンダリングはオーバーライド可能) を見つけました: Culture Aware Month Calendar and Datepicker on CodeProject

于 2011-04-21T10:40:08.823 に答える