【问题标题】:LVN_GETDISPINFO receiver -- whether the list control's parent must be as it?LVN_GETDISPINFO 接收者——列表控件的父级是否必须为它?
【发布时间】:2021-11-03 15:46:04
【问题描述】:

在 WinAPI 中,有 ListView 控件。当它不保存任何数据时,可以调整此控件以在所谓的虚拟模式下工作。相反,它从其父窗口查询这些数据。至少,根据documentation.

我目前正在处理一个旧的 MFC 驱动的项目。我遇到了一件奇怪的事情:主题中指定的通知处理程序放在CListCtrl 后继类中。也就是说,列表控件将通知发送给它自己。这有效。不过,从技术角度来看,这并不令人惊讶。可能......但是,另一方面,为什么文档中提到父窗口作为通知接收者?

我的问题:架构上LVN_GETDISPINFO 的处理程序放在列表控件类中,而不是文档中所说的父窗口类中是否是正确的想法?与文档中的解决方案相比,此解决方案是否有一些优势?

【问题讨论】:

    标签: c++ winapi mfc


    【解决方案1】:

    MFC 具有message reflection 技术。 (同样的事情是available 到 ATL/WTL)。通知消息仍会到达父级,但父级会将它们反映给控件,从而更改消息代码。

    当您使用控件而不覆盖其行为并且不继承它时,父窗口负责其行为,就像您使用通用控件一样。

    当您对控件进行子类化以定义更具体的行为时,最好在子类化控件中定义消息处理,以防止这种在控件与其父控件之间传播。


    Delphi 和 C++Builder 中可用的 UI 框架 VCL 做同样的事情。它将通知消息从父窗口反映到子控件,将它们转换为子控件类中的事件。事件由控件触发,控件始终由框架子类化,通知消息始终按内部反映的方式处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2012-04-30
      • 2022-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多