【问题标题】:Convert a modeless dialog to modal at runtime在运行时将无模式对话框转换为模式
【发布时间】:2010-11-16 14:10:56
【问题描述】:

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

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

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

所以我需要在运行时将无模式对话框转换为模态对话框,反之亦然。有没有办法做到这一点?

谢谢。

【问题讨论】:

    标签: mfc modal-dialog cdialog


    【解决方案1】:

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

    我使用主机的这两个功能: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();
    }
    

    感谢您的帮助。

    【讨论】:

      【解决方案2】:

      如果不关闭并重新打开对话框,就无法轻松做到这一点。然后可以酌情调用 ShowWindow 或 DoModal。

      【讨论】:

        【解决方案3】:

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

        我已亲自完成此操作,因此可能对您有用,但我不确定您要做什么。

        【讨论】:

        • 禁用/启用父级是什么意思?我已经尝试调用 GetParent()->EnableWindow(FALSE)/GetParent()->EnableWindow(TRUE),但这不起作用,因为我的对话框也被禁用。父窗口恰好是我不知道这是否相关的主框架。顺便说一句:我想要做的是当用户按下按钮时打开一个无模式对话框(创建/显示窗口),对话框变为模式。如果用户再次按下按钮,对话框再次变为无模式。
        猜你喜欢
        • 2011-07-01
        • 2015-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 2014-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多