【问题标题】:Reopen modal dialog in MFC在 MFC 中重新打开模式对话框
【发布时间】:2023-03-20 10:32:01
【问题描述】:

我需要打开一个从同一个类实例化的对话框两次。当我尝试这个时

CdelmeDlg dlg;
dlg.DoModal();
dlg.DoModal();

第二次调用仅在瞬间打开对话框,然后关闭。我敢打赌,消息队列中有一条剩余消息,所以我在两次调用之间添加了这条消息

MSG msgCur;
while (::PeekMessage(&msgCur, NULL, NULL, NULL, PM_REMOVE))
    ;

这解决了问题,但感觉是一种错误的做法。有没有办法正确处理剩余的消息?

【问题讨论】:

  • 这看起来很奇怪你到底想达到什么目的?
  • 我需要让我的应用程序在没有 UI 的情况下运行,并在每次计时器用完时弹出此对话框。
  • 你是如何关闭对话框的?
  • 但是你为什么要调用 DoModal 两次?
  • 为了隔离问题,我使用应用程序向导创建了一个空的基于对话框的应用程序。这将所有命令消息处理留给 MFC。如果我创建一个 OnBnClicked 方法,将其映射为处理按钮的点击消息并从那里调用 EndDialog(IDOK),也会发生同样的事情。

标签: mfc modal-dialog


【解决方案1】:

不要调用 EndDialog(IDOK);

要处理按下的确定或取消按钮,只需继承 OnOk 或 OnCancel ...否则 EndDialog 将被调用两次,您将遇到问题!

【讨论】:

    【解决方案2】:

    其实我觉得叶飞说的有道理。

    自从我玩过 MFC 已经有一段时间了(谢天谢地),但是从记忆中,计时器可能会或可能不会从 UI 线程调用,具体取决于您使用的线程。如果在主 UI 线程上启动计时器,则模式对话框可能会暂停主线程,直到它被解除,之后它将被下一个计时器调用。如果计时器在单独的线程上引发,那么您的对话框不会阻塞主 UI 线程,因为它显示在单独的线程上。

    这似乎更容易想象,因为 YeenFei 指出您希望在每次触发计时器时重新显示您的对话框,并在用户单击按钮关闭它时隐藏它。这样,如果时间再次增加,它所做的只是重新显示对话框,无论它当前是否打开。

    有一篇很棒的帖子 here (www.eggheadcafe.com) 关于计时器和并发,您可能会觉得有趣,并且可能比我设法完成的事情更清楚。

    【讨论】:

      【解决方案3】:

      为什么不能这样编码:

      CdelmeDlg dlg; 
      dlg.DoModal(); 
      
      CdelmeDlg dlg1; 
      dlg1.DoModal(); 
      

      【讨论】:

        【解决方案4】:

        如果您希望您的应用程序在没有 UI 的情况下在后台运行,为什么不 juz 临时隐藏它呢?一个简单的函数 this->ShowWindow(SW_HIDE) 将为您完成这项工作。

        我认为你应该修改你的设计决定,因为应用程序的行为看起来像你想要的那样是不合逻辑的。

        【讨论】:

          【解决方案5】:

          我通过隐藏对话框而不是关闭它并启动另一个线程来解决问题,该线程首先休眠然后取消隐藏对话框。

          【讨论】:

            【解决方案6】:

            可能是你的代码有一行:

            m_pMainWnd = &dlg;
            

            如果是这样,那么在第一次调用 DoModal() 之后的应用程序将完成,所有其他的 DoModal() 调用将返回 -1。来自 MSDN:

            当 m_pMainWnd 引用的窗口关闭时,Microsoft 基础类库将自动终止您的线程。如果这个线程是应用程序的主线程,应用程序也将被终止。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-01
              • 2013-06-09
              • 1970-01-01
              • 2011-04-12
              相关资源
              最近更新 更多