【问题标题】:Show a custom calendar dropdown with a derived DateTimePicker class显示带有派生 DateTimePicker 类的自定义日历下拉列表
【发布时间】:2011-04-21 18:40:08
【问题描述】:

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

【问题讨论】:

  • 嗨,我在哪里可以找到DTN_DROPDOWN 的实际消息代码?搜索了网络,但他们只提到名称而不是代码。谢谢。
  • 没关系我的问题在这里得到了回答stackoverflow.com/questions/40587540/…

标签: c# winapi datetimepicker


【解决方案1】:

您是否尝试过发送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)

【讨论】:

  • 感谢提示,消息正常关闭日历。但是,鼠标捕捉的问题依然存在,“this.Capture=false”不起作用。
【解决方案2】:

我终于找到了这个完全可定制的 datePicker(monthCalendar 渲染是可覆盖的):Culture Aware Month Calendar and Datepicker on CodeProject

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多