none
CDockablePane中消息响应顺序问题 RRS feed

  • 问题

  • 在CDockablePane中,放了一个控件。现在想要在在Dockpane的这个控件相应一个按键事件WM_KEYDOWN。

    现在发现,总是CMainFrame的PreTranslateMessage把KEY_DOWN截获。而不是DockablePane先响应。

    按说不应该是CDockablePane先相应,如果没处理再向上广播吗?

    2019年4月25日 6:52

全部回复

  • 你好,

    非常感谢在MSDN论坛发帖提问。

    >>现在发现,总是CMainFrame的PreTranslateMessage把KEY_DOWN截获。而不是DockablePane先响应。
    按说不应该是CDockablePane先相应,如果没处理再向上广播吗?

    WM_KEYDOWN 是键盘的触发消息, 当鼠标、键盘事件被触发后,相应的鼠标或键盘驱动程序就会把这些事件转换成相应的消息,然后输送到系统消息队列,由Windows系统去进行处理。 Windows系统则在适当的时机,从系统消息队列中取出一个消息(GetMessage(...)),根据MSG消息结构确定消息是要被送往那个窗口,然后把取出的消息送往创建窗口的线程的相应队列,线程看到自己的消息队列中有消息,就从队列中取出来,通过操作系统发送到合适的窗口过程去处理。MFC中PreTranslateMessage是GetMessage(...)函数的下一级操作,即GetMessage(...)从消息队列中获取消息后,交由PreTranslateMessage()函数先处理,若其返回FALSE则再交给TranslateMessage和DispatchMessage处理();

    你可以通过在自己定义的CMainFrame的类中重写这个虚函数,让其不拦截WM_KEYDOWN,则Dockpane中控件能响应WM_KEYDOWN。就像这样:

    BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
    {
         // TODO: 在此添加专用代码和/或调用基类
         if (pMsg->message == WM_KEYDOWN)
         {
             return false;
         }
         return CFrameWndEx::PreTranslateMessage(pMsg);
    }

    Best Wishes,

    Jack Zhang


    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年4月26日 6:53
    版主