在MFC中,假设我有一个对话框,在这个对话框中,它有一个子CListCtrl,然后我用鼠标点击这个CListCtrl,我们知道最终一个WM_LBUTTONDOWN消息被发送给CListCtrl。我的问题是:这个WM_LBUTTONDOWN消息是如何到达那里的?两种可能性:
- 对话框首先得到这个WM_LBUTTONDOWN消息,它发现鼠标点击发生在它的子窗口,然后它把这个消息转发给CListCtrl。
- CListCtrl首先得到这个WM_LBUTTONDOWN消息,它可以处理这个消息,如果它不在乎,它会把这个消息转发给父窗口,即对话框进行进一步处理。
哪个是真的?
谢谢。
输入消息永远不会发送到窗口。它们被发送到与窗口关联的消息队列中,等待通过消息检索函数之一(GetMessage、PeekMessage等)进行检索。
根据对话框是modal还是非模态,消息由嵌套的模态循环(对于modal对话框)或应用程序的消息循环来检索。然后将消息传递给DispatchMessage,以查找收件人(从鼠标指针下最顶层可见的窗口开始,既未禁用也未透明),并调用关联窗口的窗口过程。窗口过程可以决定是否处理该消息。如果窗口过程不处理消息,则通常调用DefWindowProc来执行默认处理。
总结:应用程序的消息循环(或嵌套的模态消息循环)首先看到消息,并指示窗口管理器将消息传递给相应的接收者。
有关Windows消息处理的详细说明,请参阅关于消息和消息队列。该描述是特定于Windows API的。由于MFC只是Windows API的包装器,因此其内容也适用于MFC,尽管一些概念隐藏在典型的MFC应用程序中。