【问题标题】:MFC Message flow for controls?用于控件的 MFC 消息流?
【发布时间】:2015-07-28 05:41:33
【问题描述】:

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

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

哪一个是真的?

谢谢。

【问题讨论】:

    标签: c++ mfc message


    【解决方案1】:

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

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

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多