【问题标题】:MFC: Expanding during runtimeMFC:在运行时扩展
【发布时间】:2020-07-23 11:02:54
【问题描述】:

我有一个使用 MFC 的 GUI 项目。

小部件(控件)在编译时消息映射表中进行消息处理。

我想在运行时有条件地向表单添加控件,但我不知道如何在运行时将消息处理程序附加到消息映射。

如何在运行时将消息处理程序添加到 MFC 消息映射?

我应该使用其他流程吗?

有关消息映射的信息,请参阅MFC Message Maps documentation

环境:
Windows 7 或 Windows 10(该应用程序适用于两种操作系统)
视觉工作室 2017

【问题讨论】:

  • 是的,我知道还有其他 GUI 框架,但我没有时间将 GUI 切换到另一个框架,例如 wxWidgets。
  • 我还没有尝试过,但是您可以使用您想要更改的消息映射从您的类派生另一个类,覆盖未记录的virtual const AFX_MSGMAP* GetMessageMap() const; 函数,并返回一个指向您可以构建的消息映射。
  • @1201ProgramAlarm 我之前遇到的另一个障碍是如何为自定义(继承)控件定义消息映射。还没找到例子。
  • 您可以(也许)设置您的自定义控件以发布 WM_NOTIFY 消息,这可以处理大量不同的事情,具体取决于您如何自定义关联的 NMHDR 结构。

标签: c++ visual-studio-2017 mfc message-map


【解决方案1】:

如果您知道为添加的控件提供的“ID”值的范围(应该如此),那么您可以在消息映射中使用 ON_CONTROL_RANGE 条目,而不是 ON_CONTROL(通常用于特定的单个控件)。例如,对于单击其中一个控件的按钮(其 ID 在IDC_FIRSTIDC_LAST 范围内,您可以添加以下消息映射条目:

    ON_CONTROL_RANGE(BN_CLICKED, IDC_FIRST, IDC_LAST, OnButtonClick)

消息处理程序OnButtonClick 与单个控件的格式非常相似,但带有UINT 参数,即发送消息的控件的ID:

void MyDialog::OnButtonClick(UINT nID)
{
    int button_number = static_cast<int>(nID - IDC_FIRST);
    // .. do something
    return;
}

请随时要求进一步澄清和/或解释。

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2011-05-10
    • 2013-10-14
    • 2015-11-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多