从 CDialog 派生的对话框在 DoModal (MFC/C++) 之后返回 -1

Posted

技术标签:

【中文标题】从 CDialog 派生的对话框在 DoModal (MFC/C++) 之后返回 -1【英文标题】:A Dialog derived from CDialog returns -1 after DoModal (MFC/C++) 【发布时间】:2011-01-11 15:09:48 【问题描述】:

我创建了一个从 CDialog 派生的 Dialog(MFC 会自动执行此操作),但我必须重写 OnInitDialog 方法来初始化 ComboBox:

BOOL CLogin::OnInitDialog()

 CDialog::OnInitDialog();

 InitCommonControls();

 if ( FillInCombo() != 0 )
  //erro ao tentar ler leitoras
  return TRUE;

 return TRUE;

FillInCombo 方法调用一个 PCSC 类以使用所有可用的智能卡读卡器填充此组合。

但是,在调试时发生了一个奇怪的行为。在尝试选择组合上的一个项目时,它会自动关闭(它实际上会生成一个 OnClose 事件)并且 DoModal 返回 -1。

然后,接下来,除非我清理解决方案并重新构建它,否则应用程序永远不会再次正确加载。

 CLogin SmartNetData;
 int ret = SmartNetData.DoModal();
 switch ( ret )
 
    case IDOK:
    break;
    case -1: 
    // strange error
    OnOK();
    return TRUE;
    case IDABORT:
    case IDCANCEL:
    OnOK();
    return TRUE;
 ;

感谢您对此提供的任何帮助。

稍后编辑:我意识到问题是由于组合框而出现的。我不确定为什么。我用 ListBox 替换它,我没有遇到麻烦。

【问题讨论】:

您是否正在处理来自组合的任何消息? 不是直接的,我有一个按钮可以在用户选择项目后触发组合中项目的提取。 【参考方案1】:

我怀疑你的 OnInitDialog() 出了点问题。

我建议你去调试步骤: a) 删除 OnInitDialog() 中的 InitCommonControls() b) 删除 OnInitDialog() 中的 FillInCombo() c) 删除 OnInitDialog() 中的 InitCommonControls() 和 FillInCombo()

一一删除后,检查DoModal返回值。

【讨论】:

感谢您的帮助!我删除了 FillinCombo 功能。我对此进行了很多思考(我昨天晚上在家中阅读了您的答案),看起来您是对的,因为此函数调用 PCSC DLL 并使用 std::vector 但是我删除了它,它仍然存在。我已经删除了 InitCommonControls 函数,因为 unwind 解释说它根本没有必要。在 MFC 向导创建的主类中已经调用了 InitCommonControlsEx 方法。 这是 VS 2005 为组合框生成的代码中的内容。或者我错过了什么。【参考方案2】:

认为你在错误的地方做InitCommonControls()。这应该在您的程序中完成一次。它初始化公共控件库。不是对话框本身的控件。

我通常将它放在应用程序的启动例程中,然后再打开任何窗口。

【讨论】:

感谢您的帮助" 我从代码中删除了它,但问题仍然存在。

以上是关于从 CDialog 派生的对话框在 DoModal (MFC/C++) 之后返回 -1的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 std::async 显示 Cdialog

当 CDialog.DoModal() 函数无法创建对话框时?

MFC(C++)CDialog DoModal()没有按预期工作

如何使用修改后的 DLGTEMPLATEEX 调用 CDialog::DoModal()

在启动前隐藏一个MFC DoModal对话框

使 CDialog 可见