【问题标题】:MFC DDX_Radio causes debug assertion failure when DoDataExchange is called (dlgdata.cpp Line 286)调用 DoDataExchange 时,MFC DDX_Radio 导致调试断言失败(dlgdata.cpp 第 286 行)
【发布时间】:2017-03-11 00:09:08
【问题描述】:

我有一个带有 4 个按钮组的单选按钮对话框。 DoDataExchange 中的DDX_Radio(pDX, D_RADIO_GROUPLEAD, intToStore) 用于保存和加载。 它工作得很好。

选择更改,调用 DoDataExchange,存储和加载数据没有问题。

当我隐藏其中一个单选按钮时出现问题(通过ShowWindow(SW_HIDE) 隐藏它。我们将其称为第三个按钮以供参考。之前,选择是第三个按钮。

我的逻辑会自动选择默认值(在编辑器中将 Group 标记为 true)。我调用按钮的 SetCheck(1)。

从视觉上看,一切似乎都在工作。

但是,当我单击第二个按钮,然后尝试调用 DoDataExchange(因此是 DDX_Radio)时,会导致调试断言失败。 (dlgdata.cpp 第 286 行)

数据未正确填充回intToStore

为什么会这样?我该如何避免这个问题?

谢谢。

【问题讨论】:

  • 你的代码在哪里?如果您不提供违规代码,我们如何回答您的问题?您是否查看了 dlgdata.cpp 第 286 行的代码?这可能会给你一个提示。

标签: c++ mfc ddx


【解决方案1】:

问题是,Windows 中的自动单选按钮会跳过被禁用的按钮。详细地。在选择并禁用按钮 3 时单击按钮 2。按钮 2 被选中,但按钮 3 未被选中。

DoDataExchange 运行时会出现下一个问题。它不检查按钮是启用还是禁用。 DDX_Radio 只是遍历所有单选按钮,它发现组中的 2 个按钮已启用。这会导致 ASSERT。 DDX_Radio 不关心按钮是启用还是禁用。

我的建议:自己使用自定义 OnClick 句柄,并手动禁用所有其他按钮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    相关资源
    最近更新 更多