none
CDateTimeCtrl如何发送DTN_DROPDOWN消息弹出月历控件 RRS feed

  • 问题

  • 重载CDateTimeCtrl,希望在dialog中的CDateTimeCtrl控件,TAB键使其选中,如何键盘按下down,使月历弹出。以下为代码:

    ON_NOTIFY_REFLECT_EX(DTN_DROPDOWN, OnDtnDropdown)

    void MyDateTimeCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
      switch (nChar) {
      case VK_DOWN:
        SendMessage(DTN_DROPDOWN);
        break;
      default:
        break;
      }
      CWnd::OnKeyDown(nChar,nRepCnt,nFlags);
    }

    该控件没有设置为DTS_UPDOWN,但是SendMessage之后无法到OnDtnDropdown中,请教高手这该怎么解决呢?

    2018年12月20日 7:20

全部回复

  • 你好,

    感谢在微软论坛发帖提问。

    >>该控件没有设置为DTS_UPDOWN,但是SendMessage之后无法到OnDtnDropdown中.

    当对话框中有控件时,对话框本身永远不会得到焦点。 原因在于在基于对话框的应用程序中,焦点始终在其中一个子控件上,而不是在主对话框窗口上。 按下按钮时,WM_KEYDOWN消息将被发送到具有焦点的控件,因此永远不会调用MyDateTimeCtrl::OnKeyDown。 如果希望对话框处理WM_KEYDOWN消息,我们需要覆盖对话框的PreTranslateMessage函数。

    我建议你可以参考这个链接:https://stackoverflow.com/questions/4699148/why-doesnt-onkeydown-catch-key-events-in-a-dialog-based-mfc-project

    Best wishes,

    Jeanine Zhang

    2018年12月24日 9:36
    版主
  • 非常感谢!不过我可能没说清楚:

    1.MyDateTimeCtrl不是对话框类,而是继承自CDateTimeCtrl的类

    2.我的问题是调用SendMessage(DTN_DROPDOWN)后无法到OnDtnDropdown中,而不是无法调用MyDateTimeCtrl::OnKeyDown,在这个例子中MyDateTimeCtrl::OnKeyDown是可以被调用的,只是发送消息后无法到OnDtnDropdown中。

    3.重申一下,我的问题是如何写代码调用OnDtnDropdown而不是点击控件中的按钮,例子中只是一种方法,不限于该方法

    2019年2月12日 9:55