2017-01-23 277 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 

我知道這不是最好的解決方案,但希望可以幫助別人。

不要嘗試迭代主窗口的所有子窗口來查找對話框。它不會幫助。對話框的所有者並不意味着它是對話框的父對象。