Mfc 在运行时将非模态对话框转换为模态对话框

Mfc 在运行时将非模态对话框转换为模态对话框,mfc,modal-dialog,cdialog,Mfc,Modal Dialog,Cdialog,我有一个对话框(CDialog派生类),可以以两种不同的方式使用(编辑模式和编程模式) 当对话框打开以在编程模式下使用时,它是一个无模式对话框,用于修改主视图(类似于工具栏)。当它在编辑模式下打开时,用户可以更改对话框本身的配置,在这种情况下,它是一个模式对话框 现在,它们是两个不同的对话框,几乎没有什么不同,我想有一个just want对话框,让用户只需按下对话框中的一个按钮,就可以在编程模式和编辑模式之间切换 因此,我需要在模式对话框中转换非模式对话框,在运行时反之亦然。有没有办法做到这一点

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

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

现在,它们是两个不同的对话框,几乎没有什么不同,我想有一个just want对话框,让用户只需按下对话框中的一个按钮,就可以在编程模式和编辑模式之间切换

因此,我需要在模式对话框中转换非模式对话框,在运行时反之亦然。有没有办法做到这一点


谢谢。

如果不关闭并重新打开对话框,这是很难做到的。然后您可以根据需要调用ShowWindow或DoModal。

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


我个人做过这件事,所以这可能对你有用,尽管我不确定你到底想做什么。

因为将来可能有人对做类似的事情感兴趣,所以我最终是这样做的:

我使用主框架的这两个函数:
cmainrame::BeginModalState()
cmainrame::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();
}

感谢您的帮助。

禁用/启用家长是什么意思?我已经尝试调用GetParent()->EnableWindow(FALSE)/GetParent()->EnableWindow(TRUE),但由于我的对话框也被禁用,因此无法工作。父窗口恰好是主框架,我不知道这是否相关。顺便说一句:我想做的是打开一个非模态对话框(创建/显示窗口),当用户按下按钮时,对话框变成模态。如果用户再次按下按钮,对话框将再次变为无模式。