2017-01-23 273 views
3

我们有一个对话框X,可以通过不同的线程(也是主线程)打开模态。多个模式X对话,同时从不同的线程是可能的。MFC,如何从主窗口关闭模态对话框?

如果主窗口处理SC_CLOSE消息,我们要关闭所有X(仅限于X)模态对话框。

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

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

+0

[跨进程父/子或拥有者/拥有的窗口关系是否合法?](https://blogs.msdn.microsoft.com/oldnewthing/20130412-00/?p=4683)*“是的,这在技术上是合法的,在技术上也是合法的。“* – IInspectable

+0

@IInspectable我们的对话就像一个消息框,所以我们没有真正的管理问题。看起来我的问题看起来像:[链接](http://stackoverflow.com/questions/17427103/windows-messagebox-ignoring-wm-close),但我不想关闭'X'对话框。 –

+0

你不明白这个问题。您正在使用模式对话框,并且拥有另一个线程拥有的所有者窗口。如果您专门实施了此安全措施,则仅支持此方案。由于您使用MFC,因为您无法访问消息分派代码,所以这是不可能的。这是烘烤到MFC的实现。你在做什么是不安全的,不能安全。 – IInspectable

回答

2

我现在的解决方案是;

所有模式X对话框已在注册集合(线程安全)中注册,在打开它们的过程中。如果主窗口变为SC_CLOSE-消息,则现在可以迭代所有对话框。然后在每个对话框中使用这两行中的一行。

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

我知道这不是最好的解决方案,但希望可以帮助别人。

不要尝试迭代主窗口的所有子窗口来查找对话框。它不会帮助。对话框的所有者并不意味着它是对话框的父对象。