MFC控件的消息流?

时间:2015-05-16 09:38:03

标签: c++ mfc message

在MFC中,假设我有一个对话框,在这个框中,它有一个子CListCtrl,然后我用鼠标点击这个CListCtrl,我们知道最终WM_LBUTTONDOWN消息被发送到CListCtrl。我的问题是:这个WM_LBUTTONDOWN消息是如何到达那里的? 两种可能性:

  1. 对话框首先获取此WM_LBUTTONDOWN消息,并发现鼠标单击发生在其子窗口中,然后将此消息转发给CListCtrl。
  2. CListCtrl首先获取此WM_LBUTTONDOWN消息,它可以处理此消息,如果它不关心它会将此消息转发到父窗口,即进一步处理的对话框。
  3. 哪一个是真的?

    感谢。

1 个答案:

答案 0 :(得分:2)

输入消息永远不会发送到窗口。它们发布到与窗口关联的消息队列,等待通过其中一个消息检索功能(GetMessagePeekMessage等)进行检索。

根据对话框是模态还是无模式,将通过嵌套模态循环(对于模态对话框)或应用程序的消息循环。然后将消息传递给DispatchMessage,以找到收件人(从鼠标指针下方最顶层的可见窗口开始,既不禁用也不透明),并调用相关窗口的窗口过程。窗口过程可以决定它是否处理消息。如果窗口过程不处理消息,则窗口过程通常会调用DefWindowProc来执行默认处理。

总结:应用程序的消息循环(或嵌套的模态消息循环)首先看到消息,并指示窗口管理器将消息传递给相应的收件人。

<小时/> 有关Windows消息处理的详细说明,请访问About Messages and Message Queues。该描述特定于Windows API。由于MFC只是Windows API的包装,因此内容也适用于MFC,即使某些概念隐藏在典型的MFC应用程序中。