在运行时将无模式对话框转换为模态

时间:2009-08-04 06:24:50

标签: mfc modal-dialog cdialog

我有一个对话框(CDialog派生类),可以以两种不同的方式使用(编辑模式和编程模式)。

当对话框打开以在编程模式下使用时,它是一个无模式对话框,用于修改主视图(工具栏的种类)。当它在编辑模式下打开时,用户可以更改对话框本身的配置,在这种情况下,它是一个模态对话框。

现在它们是两个不同的对话框,几乎没有差异,我想只需要对话框,让用户只需按对话框中的按钮即可在编程模式和编辑模式之间切换。

所以我需要在运行时在模态对话框中转换无模式对话框,反之亦然。有没有办法实现这个目标?

感谢。

3 个答案:

答案 0 :(得分:11)

也许有人可能有兴趣在将来做类似的事情,这是我最终做到的方式:

我使用主框架的这两个功能:CMainFrame::BeginModalState()CMainFrame::EndModalState()

这些功能的问题与禁用父窗口的问题相同。您要制作模态的窗口也会被禁用。但解决方案很简单,只需在调用BeginModalState后重新启用窗口。

void CMyDialog::MakeModal()
{
   //disable all main window descendants
   AfxGetMainWnd()->BeginModalState();

   //re-enable this window
   EnableWindow(TRUE);
}

void CMyDialog::MakeModeless()
{
   //enable all main window descendants
   AfxGetMainWnd()->EndModalState();
}

感谢您的帮助。

答案 1 :(得分:2)

如果不关闭并重新打开对话框,则无法轻松。然后您可以根据需要调用ShowWindow或DoModal。

答案 2 :(得分:1)

这是不正确的。这可以做到,如果你看看MFC的源代码,你会发现它的模态对话框在技术上甚至不是模态的。你将不得不做很多事情来使这项工作正常,但基本上你只需要禁用'模态'窗口的父级,并在'模态'窗口关闭时重新启用它。

我亲自完成了这项工作,所以这对你有用,虽然我不确定你要做什么。