【问题标题】:MFC, How to close Modal Dialogs from Main Window?MFC,如何从主窗口关闭模式对话框?
【发布时间】:2017-06-07 20:44:10
【问题描述】:

我们有一个对话框X,可以由不同的线程(也是主线程)以模态方式打开。多个模态X 对话框,可以同时来自不同的线程。

如果主窗口处理SC_CLOSE 消息,我们希望关闭所有X(仅X)模式对话框。

问题是;在主窗口中,当收到SC_CLOSE 消息时,我们如何关闭所有模态X 对话框?只有X!所以,PostQuitMessage 没有帮助,因为它关闭了整个应用程序,我们不想关闭应用程序,如果打开了像 Y, Z ... 这样的其他模式对话框。

信息:主窗口可以处理SC_CLOSE 消息,当我们从主线程也从其他线程打开模态X 对话框时。而X 没有子模态窗口。

【问题讨论】:

  • Is it legal to have a cross-process parent/child or owner/owned window relationship? “是的,这在技术上是合法的。在技术上玩电锯也是合法的。”
  • @IInspectable 我们的对话框就像一个消息框,所以我们没有真正的管理问题。看来我的问题看起来像:link,但我不想关闭X-dialog。
  • 你没有理解这个问题。您正在使用模式对话框,其所有者窗口由另一个线程拥有。仅当您为了安全而专门实施此方案时,才支持此方案。由于您使用的是 MFC,这是不可能的,因为您无权访问消息调度代码。这已融入 MFC 实现。你正在做的事情不安全,也不能保证安全。
  • @IInspectable 你是对的,但总有一些东西我永远无法改变:)。我不能再改变设计了。我正在开发一个已有 20 年历史的软件。直到今天,由于安全,我们从未遇到过问题。看起来,不同的线程显示了一个自定义消息框。也许所有X-dialogs 都可以以线程安全的方式注册到静态全局集合中,那么我可以关闭这些对话框吗?
  • WM_CLOSE 是单击关闭按钮时发送的消息,而不是SC_CLOSE。您也可以自己发送。当然,因为你有一个多线程设置,我不确定如果你告诉消息框在任何给定点关闭会发生什么......

标签: c++ multithreading winapi mfc


【解决方案1】:

我目前的解决方案是;

所有模态X 对话框在打开期间都已注册到集合中(线程安全)。 如果主窗口变为SC_CLOSE-消息,则现在可以迭代所有对话框。然后为每个对话框使用这两条线之一。

  ::PostMessage(pDlg->GetSafeHwnd(), WM_COMMAND, IDOK, 0); //end dialog with idok
  ::PostMessage(pDlg->GetSafeHwnd(), WM_CLOSE, 0, 0);      //or, close dialog

我知道这不是最好的解决方案,但希望对某人有所帮助。

不要尝试遍历主窗口的所有子窗口来查找对话框。它没有帮助。对话框的所有者,并不意味着它是对话框的父级。

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2012-02-09
    • 1970-01-01
    • 2012-04-22
    相关资源
    最近更新 更多