Visual C++ 中顺序对话框的最佳实践是啥?

Posted

技术标签:

【中文标题】Visual C++ 中顺序对话框的最佳实践是啥?【英文标题】:What's the best practice for sequential dialogs in Visual C++?Visual C++ 中顺序对话框的最佳实践是什么? 【发布时间】:2011-04-13 15:59:23 【问题描述】:

我有一个应用程序必须根据一些输入数据计算一些数字。此数据可以来自文件,也可以手动输入(只有 5-6 个值)。我想展示一个对话框,基本上询问“您是要从文件中加载数据还是手动输入?”。如果选择“加载”,我想呈现一个文件打开对话框,然后解析所选文件以提取相关数据。如果选择“手动”,我想展示一个自定义 CDialog 子类,用户可以在其中输入从数据文件中提取的相同数据。

我的主要问题是什么被认为是串起来的最佳实践?

我应该像这样顺序调用对话框吗?

// pseudocode
void foo()
    status = MessageBox("Do you want to enter data from file?");

    if (status == YES) 
        filename = CFileDialog();
        inputdata = processInputFile(filename);
    
    else 
        CManualEntryDialog.doModal();
        inputdata = CManualEntryDialog.data;
    

    // calculate output data from input data...

或者我应该继承 CDialog 并从子类事件处理程序中调用 CFileDialog 和 CManualEntryDialog?

【问题讨论】:

一个对话框和面板/标签两种输入有什么问题? (如果你想真正划分它,或者在同一个对话框中加载用户控件)[只是好奇] 这没什么错,只是我不知道该怎么做。 我应该提到这是 MFC,而不是 .NET。 这些实际上不是连续的,除非您计算 MessageBox。否则,这看起来很合理。就个人而言,我有两个不同的菜单选项(数据/导入...和数据/手动输入...),但这是 UI 的事情。或者,显示手动输入对话框,并在其上放置一个 Import... 按钮。 打开是/否对话框(消息框)并根据结果打开另一个对话框没有任何问题。您真的不必经历为对话框子类化的所有麻烦。但从 UI 的角度来看,我宁愿只显示一个对话框而不是两个。一种选择是使用两个不同的菜单选项,就像 Roger 提到的那样,但是如果您没有菜单,您也可以默认显示手动数据输入对话框,并有一个从文件导入数据的按钮。这样,至少一个用例只需要一个对话框。 【参考方案1】:

似乎至少有很大一部分用户会理解所涉及的数字;它们并不“神奇”。因此,在加载后显示它们是有意义的。您可以很好地将其与手动输入选项集成。

设计一个包含 6 个输入字段的对话框。添加填充这些字段的“加载”按钮,但不要从那里继续。这允许用户验证并可能修改这些值。 (当他需要输入文件中 5 个值中的 4 个时很有用)。

请在 6 个输入字段周围使用组框控件,外部带有加载/确定/取消按钮。这清楚地表明这三个按钮适用于整个组。

这种方法的用户体验优势在于它对探索更加开放。您不会强迫用户选择如何与您的应用程序交互。鉴于这种复杂程度,它不太可能压倒您的目标受众。

【讨论】:

根据上面 Boaz Yaniv 的评论,这就是我最终采用的解决方案。我添加了一个“导入...”按钮,该按钮弹出一个 CFileDialog,然后将文件名提供给解析器对象,然后使用文件中的数据更新原始对话框的字段。用户仍然必须点击 OK 才能接受数据。【参考方案2】:

对于顺序对话框,我会推荐使用 CPropertyPage 和 CPropertySheet 类的向导过程。

这是一个例子: http://www.dotnetheaven.com/Uploadfile/bulentozkir/pp_wizard04212005064904AM/pp_wizard.aspx

http://www.informit.com/library/content.aspx?b=Visual_C_PlusPlus&seqNum=79

【讨论】:

以上是关于Visual C++ 中顺序对话框的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章

visual C++ 6.0 是先点“Compile”还是“Build”?分不分点击顺序??作用各是啥??

在 C++ 中创建同时支持 Unicode 和 ASCII 的库的最佳实践是啥?

在 HD 中进行数据密集型读写的最佳实践是啥?

在 Visual Studio 中计时事件的最佳方式是啥? [关闭]

Visual Studio 2008下的C++项目结构

在 Visual Studio 2010 中管理“非 SQL Server”SQL 对象的最佳方式是啥?