调用DoDataExchange时,MFC DDX_Radio导致调试断言失败(dlgdata.cpp第286行)

时间:2017-03-11 00:09:08

标签: c++ mfc ddx

我有一个带有4个按钮组的单选按钮的对话框。 DoDataExchange中的DDX_Radio(pDX, D_RADIO_GROUPLEAD, intToStore)用于保存和加载。 它完美无缺。

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

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

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

视觉上一切似乎都在起作用。

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

数据未在intToStore中正确填充。

为什么会这样,我怎么能避免这个问题?

谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

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