MFC如何在切换视图时关闭无模式对话框

Posted

技术标签:

【中文标题】MFC如何在切换视图时关闭无模式对话框【英文标题】:MFC How to close a modeless dialog when switching views 【发布时间】:2019-03-20 21:07:33 【问题描述】:

我有一个包含无模式对话框的视图。

除了与对话框交互发送消息以修改当前活动视图上的对象外,一切正常。当我切换到新视图或另一个视图时,它会导致崩溃,因为该对象不存在于该新视图中。

想问一下切换视图时如何关闭无模式对话框?

应该在视图类还是文档类中处理?

消息路径为Dialog -> 发送用户定义消息 -> 主机 -> 获取当前活动视图 -> 传递消息 -> 查看消息句柄接收消息

谢谢

【问题讨论】:

如果您创建非模态对话框作为 CView 类的成员和子类,那么一切都是自动的。它会随着景色来来去去。您是在框架中创建它还是什么?否则,你确定你的崩溃是因为对话框吗?堆栈是什么样的? @lakeweb 我是新手。如何将对话框创建为视图的成员和子项?我所做的只是在视图类中使用 CMyDialog*(extends CDialog) 并在需要时调用新的 CMyDialog()、Create() 函数。创建对话框时是否需要指定其父视图? 【参考方案1】:

而且,在视图框架中执行此操作可能更有意义。所以...

在.h中:

class MyFrm: public CFrameWnd

    MyDialog dlg;
;

在.cpp中:

MyFrm::MyFrm( )
    :dlg( this )


void MyFrm::OnInitialUpdate()

    tagDlg.Create( this );
    tagDlg.ShowWindow( SW_NORMAL );

如果您想切换对话框,可以使用菜单项作为开关。您可以:

void MyFrm::OnToggleDlg( )

    if( ! dlg.GetSafeHwnd( ) )
    
        dlg.Create( this );
        dlg.ShowWindow( SW_NORMAL );
    
    else
        dlg.DestroyWindow( );

我希望这是有道理的。

【讨论】:

以上是关于MFC如何在切换视图时关闭无模式对话框的主要内容,如果未能解决你的问题,请参考以下文章

在 MFC 中切换到另一个模式对话框

如何使用 MFC 从控制台正确弹出无模式对话框

将焦点放在托管在 MFC 视图中的无模式对话框上

查找 MFC Dialog 的当前位置

在 SDI mfc 应用程序中从视图访问模式对话框

在 MFC 中从文档类创建无模式对话框