Немодальный диалог
От: Мёртвый Даун Россия  
Дата: 20.10.14 17:27
Оценка:
Всем привет!

Давно не юзал MFC, а тут в одном из старых проектов потребовалось внести исправления. Буду рад любым советам.

Есть MFC MDI приложение, тулбары, меню, все дела. При активном View пользователь открывает НЕмодальный диалог. Т.е. при этом он продолжает работать во View, чтото там например редактируя. В диалоговом окне при этом немедленно отображаются какие то свойства. В принципе ничего сложного, и это я уже сделал. Но тут появилась одна заковыка, в требованиях. В приложении присутствуют еще несколько модальных диалогов. Так вот, при открытии любого модального диалога, тот, немодальный диалог надо закрывать.
Не могу сообразить как этого добиться малой кровью.

Спасибо.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re: Немодальный диалог
От: SаNNy Россия  
Дата: 20.10.14 17:30
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Всем привет!


МД>Давно не юзал MFC, а тут в одном из старых проектов потребовалось внести исправления. Буду рад любым советам.


МД>Есть MFC MDI приложение, тулбары, меню, все дела. При активном View пользователь открывает НЕмодальный диалог. Т.е. при этом он продолжает работать во View, чтото там например редактируя. В диалоговом окне при этом немедленно отображаются какие то свойства. В принципе ничего сложного, и это я уже сделал. Но тут появилась одна заковыка, в требованиях. В приложении присутствуют еще несколько модальных диалогов. Так вот, при открытии любого модального диалога, тот, немодальный диалог надо закрывать.

МД>Не могу сообразить как этого добиться малой кровью.

МД>Спасибо.


CDialog::Close() не подходит?
А можно его прятать через ShowWindow(SW_HIDE)
Re[2]: Немодальный диалог
От: Мёртвый Даун Россия  
Дата: 20.10.14 18:01
Оценка:
Здравствуйте, SаNNy, Вы писали:

SNN>CDialog::Close() не подходит?

SNN>А можно его прятать через ShowWindow(SW_HIDE)

В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re: Немодальный диалог
От: VladFein США  
Дата: 20.10.14 19:58
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Не могу сообразить как этого добиться малой кровью.


CFrameWnd::BeginModalState
Re[3]: Немодальный диалог
От: SkyKnight Швейцария https://github.com/dmitrigrigoriev/
Дата: 20.10.14 20:22
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Здравствуйте, SаNNy, Вы писали:


SNN>>CDialog::Close() не подходит?

SNN>>А можно его прятать через ShowWindow(SW_HIDE)

МД>В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его?

Ну например заводишь где-то указатель на объект этого диалога. И смотришь, если он не null, то делаешь Close или DestroyWindow (там надо смотреть). Можешь даже просто послать сообщение WM_CLOSE.
github.com/dmitrigrigoriev/
Re[4]: Немодальный диалог
От: VladFein США  
Дата: 21.10.14 16:30
Оценка:
Здравствуйте, SkyKnight, Вы писали:

МД>>В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его?

SK>Ну например заводишь ....

Возмущение ТС было, похоже, в том, что этот код надо повторять в КАЖДОМ модальном диалоге.
Re[3]: Немодальный диалог
От: AlexGin Беларусь  
Дата: 23.10.14 11:48
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Здравствуйте, 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 — этот вызов не ждет, пока отработает все, а просто ставит сообщение в очередь.
На головном окне — сделать обработчик этого сообщения. Сделать так, чтобы в обработчике скрывалось немодальное диалоговое окно.
Re[5]: Немодальный диалог
От: AlexGin Беларусь  
Дата: 23.10.14 11:50
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>Здравствуйте, SkyKnight, Вы писали:


МД>>>В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его?

SK>>Ну например заводишь ....

VF>Возмущение ТС было, похоже, в том, что этот код надо повторять в КАЖДОМ модальном диалоге.

Вынести эту проверку в головное окно приложения, так как именно из головного вызываеются и модальные диалоги и НЕмодальное окно (я уже упомянул об этом выше).
Re[4]: Немодальный диалог
От: VladFein США  
Дата: 23.10.14 13:57
Оценка: 1 (1)
Здравствуйте, AlexGin, Вы писали:

МД>>В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его?


AG>В каждом модальном диалоге...


Я тоже писал выше... Главное окно получает CFrameWnd::BeginModalState(), поэтому нет небходимости делать что-нибудь "В каждом модальном диалоге..."
Re[5]: Немодальный диалог
От: Мёртвый Даун Россия  
Дата: 27.10.14 13:22
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>Здравствуйте, AlexGin, Вы писали:


МД>>>В каждом модальном диалоге перед открытием проверять открыт ли тот немодальный и закрывать его?


AG>>В каждом модальном диалоге...


VF>Я тоже писал выше... Главное окно получает CFrameWnd::BeginModalState(), поэтому нет небходимости делать что-нибудь "В каждом модальном диалоге..."


Неа, чтото у меня не получается... Открываю немодальный диалог. Затем открываю любой модальный диалог. Тот немодальный продолжает быть открытым, его можно тыкать. При открытии модального диалога я в CMyFrameWnd::BeginModalState() не попадаю.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[2]: Немодальный диалог
От: Мёртвый Даун Россия  
Дата: 27.10.14 13:33
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>Здравствуйте, Мёртвый Даун, Вы писали:


МД>>Не могу сообразить как этого добиться малой кровью.


VF>CFrameWnd::BeginModalState


Пожалуйста можно чуть поподробней. Или с примером. Пока что ничего не получается.

У меня осталась только пока вот такая задачка нерешенная: мне надо чтобы любой модальный диалог, при открытии, закрывал тот НЕмодальный (если он открыт).
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[6]: Немодальный диалог
От: VladFein США  
Дата: 27.10.14 13:49
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Неа, чтото у меня не получается... Открываю немодальный диалог. Затем открываю любой модальный диалог. Тот немодальный продолжает быть открытым, его можно тыкать. При открытии модального диалога я в CMyFrameWnd::BeginModalState() не попадаю.


Что-нибудь не правильно делается?
Можно проект посмотреть?
Re[3]: Немодальный диалог
От: VladFein США  
Дата: 27.10.14 14:11
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Пожалуйста можно чуть поподробней. Или с примером. Пока что ничего не получается.


MainFrm.h
class CMainFrame : public CMDIFrameWnd
{
// Overrides
public:
    virtual void BeginModalState();
...
}


MainFrm.cpp
void CMainFrame::BeginModalState()
{
    __super::BeginModalState();
    ::OutputDebugString(L"CMainFrame::BeginModalState()\n");
}


В окне Output выводит "CMainFrame::BeginModalState()" при открытии модального диалога?
Re[4]: Немодальный диалог
От: AlexGin Беларусь  
Дата: 28.10.14 07:41
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>Здравствуйте, Мёртвый Даун, Вы писали:


МД>>Пожалуйста можно чуть поподробней. Или с примером. Пока что ничего не получается.


VF>MainFrm.h
VF>class CMainFrame : public CMDIFrameWnd
VF>{
VF>// Overrides
VF>public:
VF>    virtual void BeginModalState();
VF>...
VF>}
VF>


VF>MainFrm.cpp
VF>void CMainFrame::BeginModalState()
VF>{
VF>    __super::BeginModalState();
VF>    ::OutputDebugString(L"CMainFrame::BeginModalState()\n");
VF>}
VF>


VF>В окне Output выводит "CMainFrame::BeginModalState()" при открытии модального диалога?

Это отлично работает!

Тут только один момент — виртуальный метод BeginModalState будет вызываться даже в том случае,
если покажешь простое модальное окно (вызвав, например MessageBox) — это также надо учитывать!
Re[5]: Немодальный диалог
От: VladFein США  
Дата: 28.10.14 13:46
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Тут только один момент — виртуальный метод BeginModalState будет вызываться даже в том случае,

AG>если покажешь простое модальное окно (вызвав, например MessageBox) — это также надо учитывать!

На мой вкус, модальный MessageBox ничем не отличается от модального диалога. По крайней мере в том, что касается "модальности"
Re[3]: Немодальный диалог
От: VladFein США  
Дата: 28.10.14 16:39
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Пожалуйста можно чуть поподробней. Или с примером. Пока что ничего не получается.


Ну?
Получилось?
Re: Немодальный диалог
От: MasterZiv СССР  
Дата: 05.02.15 12:04
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Всем привет!


МД>Давно не юзал MFC, а тут в одном из старых проектов потребовалось внести исправления. Буду рад любым советам.


МД>Есть MFC MDI приложение, тулбары, меню, все дела. При активном View пользователь открывает НЕмодальный диалог. Т.е. при этом он продолжает работать во View, чтото там например редактируя. В диалоговом окне при этом немедленно отображаются какие то свойства. В принципе ничего сложного, и это я уже сделал. Но тут появилась одна заковыка, в требованиях. В приложении присутствуют еще несколько модальных диалогов. Так вот, при открытии любого модального диалога, тот, немодальный диалог надо закрывать.

МД>Не могу сообразить как этого добиться малой кровью.

DestroyWindow во всех нужных местах, до вызова модального диалога или внутри его инициализации.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.