Давно не юзал MFC, а тут в одном из старых проектов потребовалось внести исправления. Буду рад любым советам.
Есть MFC MDI приложение, тулбары, меню, все дела. При активном View пользователь открывает НЕмодальный диалог. Т.е. при этом он продолжает работать во View, чтото там например редактируя. В диалоговом окне при этом немедленно отображаются какие то свойства. В принципе ничего сложного, и это я уже сделал. Но тут появилась одна заковыка, в требованиях. В приложении присутствуют еще несколько модальных диалогов. Так вот, при открытии любого модального диалога, тот, немодальный диалог надо закрывать.
Не могу сообразить как этого добиться малой кровью.
Спасибо.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Всем привет!
МД>Давно не юзал MFC, а тут в одном из старых проектов потребовалось внести исправления. Буду рад любым советам.
МД>Есть MFC MDI приложение, тулбары, меню, все дела. При активном View пользователь открывает НЕмодальный диалог. Т.е. при этом он продолжает работать во View, чтото там например редактируя. В диалоговом окне при этом немедленно отображаются какие то свойства. В принципе ничего сложного, и это я уже сделал. Но тут появилась одна заковыка, в требованиях. В приложении присутствуют еще несколько модальных диалогов. Так вот, при открытии любого модального диалога, тот, немодальный диалог надо закрывать. МД>Не могу сообразить как этого добиться малой кровью.
МД>Спасибо.
CDialog::Close() не подходит?
А можно его прятать через ShowWindow(SW_HIDE)
Здравствуйте, SаNNy, Вы писали:
SNN>CDialog::Close() не подходит? SNN>А можно его прятать через ShowWindow(SW_HIDE)
В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Здравствуйте, SаNNy, Вы писали:
SNN>>CDialog::Close() не подходит? SNN>>А можно его прятать через ShowWindow(SW_HIDE)
МД>В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его?
Ну например заводишь где-то указатель на объект этого диалога. И смотришь, если он не null, то делаешь Close или DestroyWindow (там надо смотреть). Можешь даже просто послать сообщение WM_CLOSE.
Здравствуйте, SkyKnight, Вы писали:
МД>>В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его? SK>Ну например заводишь ....
Возмущение ТС было, похоже, в том, что этот код надо повторять в КАЖДОМ модальном диалоге.
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Здравствуйте, SаNNy, Вы писали:
SNN>>CDialog::Close() не подходит? SNN>>А можно его прятать через ShowWindow(SW_HIDE)
МД>В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его?
В каждом модальном диалоге сделать отсылку сообщения головному окну. Примерно так:
if (pMainWnd && pMainWnd->m_hWnd)
::PostMessage(pMainWnd->m_hWnd, WN_MAIN_FRM_..., (WPARAM)1L, (LPARAM)1L);
Я обычно применяю в таких случаях именно PostMessage — этот вызов не ждет, пока отработает все, а просто ставит сообщение в очередь.
На головном окне — сделать обработчик этого сообщения. Сделать так, чтобы в обработчике скрывалось немодальное диалоговое окно.
Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, SkyKnight, Вы писали:
МД>>>В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его? SK>>Ну например заводишь ....
VF>Возмущение ТС было, похоже, в том, что этот код надо повторять в КАЖДОМ модальном диалоге.
Вынести эту проверку в головное окно приложения, так как именно из головного вызываеются и модальные диалоги и НЕмодальное окно (я уже упомянул об этом выше).
Здравствуйте, AlexGin, Вы писали:
МД>>В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его?
AG>В каждом модальном диалоге...
Я тоже писал выше... Главное окно получает CFrameWnd::BeginModalState(), поэтому нет небходимости делать что-нибудь "В каждом модальном диалоге..."
Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, AlexGin, Вы писали:
МД>>>В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его?
AG>>В каждом модальном диалоге...
VF>Я тоже писал выше... Главное окно получает CFrameWnd::BeginModalState(), поэтому нет небходимости делать что-нибудь "В каждом модальном диалоге..."
Неа, чтото у меня не получается... Открываю немодальный диалог. Затем открываю любой модальный диалог. Тот немодальный продолжает быть открытым, его можно тыкать. При открытии модального диалога я в CMyFrameWnd::BeginModalState() не попадаю.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, Мёртвый Даун, Вы писали:
МД>>Не могу сообразить как этого добиться малой кровью.
VF>CFrameWnd::BeginModalState
Пожалуйста можно чуть поподробней. Или с примером. Пока что ничего не получается.
У меня осталась только пока вот такая задачка нерешенная: мне надо чтобы любой модальный диалог, при открытии, закрывал тот НЕмодальный (если он открыт).
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Неа, чтото у меня не получается... Открываю немодальный диалог. Затем открываю любой модальный диалог. Тот немодальный продолжает быть открытым, его можно тыкать. При открытии модального диалога я в CMyFrameWnd::BeginModalState() не попадаю.
Что-нибудь не правильно делается?
Можно проект посмотреть?
Здравствуйте, VladFein, Вы писали:
VF>Здравствуйте, Мёртвый Даун, Вы писали:
МД>>Пожалуйста можно чуть поподробней. Или с примером. Пока что ничего не получается.
VF>MainFrm.h
VF>В окне Output выводит "CMainFrame::BeginModalState()" при открытии модального диалога?
Это отлично работает!
Тут только один момент — виртуальный метод BeginModalState будет вызываться даже в том случае,
если покажешь простое модальное окно (вызвав, например MessageBox) — это также надо учитывать!
Здравствуйте, AlexGin, Вы писали:
AG>Тут только один момент — виртуальный метод BeginModalState будет вызываться даже в том случае, AG>если покажешь простое модальное окно (вызвав, например MessageBox) — это также надо учитывать!
На мой вкус, модальный MessageBox ничем не отличается от модального диалога. По крайней мере в том, что касается "модальности"
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Всем привет!
МД>Давно не юзал MFC, а тут в одном из старых проектов потребовалось внести исправления. Буду рад любым советам.
МД>Есть MFC MDI приложение, тулбары, меню, все дела. При активном View пользователь открывает НЕмодальный диалог. Т.е. при этом он продолжает работать во View, чтото там например редактируя. В диалоговом окне при этом немедленно отображаются какие то свойства. В принципе ничего сложного, и это я уже сделал. Но тут появилась одна заковыка, в требованиях. В приложении присутствуют еще несколько модальных диалогов. Так вот, при открытии любого модального диалога, тот, немодальный диалог надо закрывать. МД>Не могу сообразить как этого добиться малой кровью.
DestroyWindow во всех нужных местах, до вызова модального диалога или внутри его инициализации.