从 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的主要内容,如果未能解决你的问题,请参考以下文章
当 CDialog.DoModal() 函数无法创建对话框时?
MFC(C++)CDialog DoModal()没有按预期工作