控件的 MFC 消息流?

MFC Message flow for controls?

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

  1. 对话框首先得到这个WM_LBUTTONDOWN消息,它发现鼠标点击发生在它的子window,然后它把这个消息转发给CListCtrl。
  2. CListCtrl首先得到这个WM_LBUTTONDOWN消息,它可以处理这个消息,如果它不关心它会把这个消息转发给父window,即对话框进行进一步处理。

哪个是真的?

谢谢。

输入消息永远不会发送到window。它们 发布 到与 window 关联的消息队列,等待通过消息检索功能之一(GetMessage, PeekMessage 等)检索。

根据对话框是 modal 还是 modeless,消息由嵌套模式循环检索(对于 modal 对话框)或应用程序的消息循环。然后将消息传递给 DispatchMessage, to find the recipient (starting from the topmost visible window under the mouse pointer, that is neither disabled nor transparent), and call into the associated window's window procedure. The window procedure can decide, whether it handles the message or not. A window procedure typically calls DefWindowProc 以执行默认处理(如果它不处理消息)。

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


Windows 消息处理的详尽描述可在 About Messages and Message Queues 获得。该描述特定于 Windows API。由于 MFC 只是 Windows API 的包装器,因此即使某些概念隐藏在典型的 MFC 应用程序中,内容也适用于 MFC。