语言:C ++
开发环境:Microsoft Visual C ++
使用的库:MFC
问题:我创建了一个首选项配置应用程序。左侧是一个列表框,其中包含可以更改的“父”类别的设置,当他们单击一个时,他们可以更改的设置显示在列表框的右侧,就像在许多大型首选项对话框中一样。我已经使用DDX数据交换设置了所有控件(注意:我有一个用于每个子对话框/首选项页面的cpp文件),所以我已经完成了所有基础工作。
这是我的问题。我在使用UpdateData时遇到了困难,因为我从未在首选项框中调用DoModal(),因为它们是父对话框容器的子项,并且它们只是绑定到对话框中的图片控件。当用户点击列表框时,我执行设置焦点和显示/隐藏子对话框的组合。
当用户选择“保存这些”时,他/她会看到另一个对话框,允许他们检查他们想要保存的特定首选项窗格(以生成XML配置文件)。显然我需要抓取对话框的输入,但是当程序到达代码中调用UpdateData的点时,程序失败,因为我在调用DoModal()之前调用了UpdateData。
现在我不确定如何获得价值观。我对MFC很新,也无济于事。就是这样。无论如何,我要感谢任何人都可以提供的任何帮助。
答案 0 :(得分:3)
在您展示其中一个子对话框之前,您应该调用其UpdateData(FALSE)
函数来填充其控件。这应该在外部对话框的OnInitDialog中,也可以在切换类别的代码中。在切换到子对话框(从类别更改或OnOK)之前,您应该调用UpdateData(TRUE)
从子对话框中取回更改;如果UpdateData返回FALSE,则不允许更改类别或关闭对话框。
答案 1 :(得分:1)
使用提供您似乎正在实施的功能的CTabCtrl
可能会改善用户体验。
一般情况下,在大多数情况下,您并不打算直接调用UpdateData
这是一个由OnInitDialog
调用来加载和OnOK
为模态对话框保存的框架机制。从您可能想到的意义上说,这不是加载和保存。它的作用是从OnInitDialog
中的资源或成员变量加载控制值,然后当用户单击OK时,它会验证并将对话框中控件的值保存到成员变量中。这是一种机制,允许您在重新打开对话框时显示以前的值,并在关闭它后获取值。
您可以查看CArchive
并序列化对话框,但我建议您编写自己的保存/加载框架,尤其是在处理XML配置文件时。