2017-01-23 6 views
3

У нас есть диалог X, который может быть открыт различными потоками (также основной нитью) как модальный. Возможны несколько модальных X диалогов, в то же время из разных потоков.MFC, Как закрыть модальные диалоги из главного окна?

Мы хотим, чтобы закрыть все X (только X) модальные диалоги, если главное окно обрабатывает сообщение SC_CLOSE.

Вопрос в том, Из главного окна, как мы можем закрыть все модальные диалоги X, когда он получает сообщение SC_CLOSE? Только X! Таким образом, PostQuitMessage не помогает, потому что он закрывает все приложение, мы не хотим закрывать приложение, если открываются другие модальные диалоги, такие как Y, Z ....

Главное окно может обрабатывать сообщение SC_CLOSE, когда у нас есть открытый модальный диалог X из основного потока также из других тем. И у X нет дочернего модального окна.

+0

[Является ли законным иметь взаимосвязь между родителями-родителями/дочерними или владельцем/владельцем окна?) (Https://blogs.msdn.microsoft.com/oldnewthing/20130412-00/?p=4683) * " Да, это технически законно, а также технически законно манипулировать бензопилами ». * – IInspectable

+0

@Инспективный Наш диалог похож на сообщение, поэтому у нас нет проблем с управлением. кажется, моя проблема выглядит нравится: [link] (http://stackoverflow.com/questions/17427103/windows-messagebox-ignoring-wm-close), но я не закрываю диалоговое окно 'X'. –

+0

Вы не поняли проблему. Вы используете модальный диалог с окном владельца, которым владеет другой поток. Этот сценарий поддерживается только в том случае, если вы специально его использовали для обеспечения безопасности. Поскольку вы используете MFC, это невозможно, поскольку у вас нет доступа к коду диспетчеризации сообщений. Это запекается в реализации MFC. То, что вы делаете, небезопасно и не может быть безопасным. – IInspectable

ответ

2

Мое настоящее решение;

Все модальные диалоги X были зарегистрированы в коллекции (поточно-безопасно) при их открытии. Если главное окно становится SC_CLOSE -message, то теперь возможен итерационный диалог. Затем используйте одну из этих двух строк для каждого диалога.

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

Я знаю, что это не лучшее решение, но надежда помогает кому-то.

Не пытайтесь выполнить итерацию всех дочерних элементов главного окна, чтобы найти диалоги. это не поможет. Владелец диалогов не означает, что он является родителем диалогов.