MFC 控件的消息流?

问题描述 投票:0回答:1

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

  1. 对话框首先收到此WM_LBUTTONDOWN消息,发现其子窗口发生鼠标点击,则将此消息转发给CListCtrl。
  2. CListCtrl首先得到这个WM_LBUTTONDOWN消息,它可以处理这个消息,如果它不关心它会将此消息转发到父窗口,即对话框进行进一步处理。

哪一个是真的?

谢谢。

c++ mfc message
1个回答
3
投票

输入消息永远不会“发送”到窗口。它们被发布到与窗口关联的消息队列,等待通过消息检索函数之一进行检索(GetMessage

PeekMessage
等)。
根据对话框是

modal

还是modeless,消息由嵌套模态循环(对于modal对话框)或应用程序的消息循环检索。然后消息被传递到 DispatchMessage

 来查找接收者(从鼠标指针下最上面的可见窗口开始,该窗口既不是禁用的也不是透明的),并调用关联窗口的窗口过程。窗口消息处理程序可以决定是否处理该消息。如果窗口消息处理程序不处理消息,它通常会调用 
DefWindowProc
 来执行默认处理。
总结一下:应用程序的消息循环(或嵌套模式消息循环)首先查看消息并指示窗口管理器将消息传递给相应的接收者。

有关 Windows 消息处理的完整描述,请参阅
关于消息和消息队列

。该描述特定于 Windows API。由于 MFC 只是 Windows API 的包装,因此内容也适用于 MFC,即使某些概念隐藏在典型的 MFC 应用程序中。

© www.soinside.com 2019 - 2024. All rights reserved.