在MFC中,假设我有一个对话框,在这个框中,它有一个子CListCtrl,然后我用鼠标点击这个CListCtrl,我们知道最终WM_LBUTTONDOWN消息被发送到CListCtrl。我的问题是:这个WM_LBUTTONDOWN消息是如何到达那里的? 两种可能性:
哪一个是真的?
感谢。
答案 0 :(得分:2)
输入消息永远不会发送到窗口。它们发布到与窗口关联的消息队列,等待通过其中一个消息检索功能(GetMessage,PeekMessage等)进行检索。
根据对话框是模态还是无模式,将通过嵌套模态循环(对于模态对话框)或应用程序的消息循环。然后将消息传递给DispatchMessage,以找到收件人(从鼠标指针下方最顶层的可见窗口开始,既不禁用也不透明),并调用相关窗口的窗口过程。窗口过程可以决定它是否处理消息。如果窗口过程不处理消息,则窗口过程通常会调用DefWindowProc来执行默认处理。
总结:应用程序的消息循环(或嵌套的模态消息循环)首先看到消息,并指示窗口管理器将消息传递给相应的收件人。
<小时/> 有关Windows消息处理的详细说明,请访问About Messages and Message Queues。该描述特定于Windows API。由于MFC只是Windows API的包装,因此内容也适用于MFC,即使某些概念隐藏在典型的MFC应用程序中。