Из какого либо оконного приложения запущен модальный диалог.
Хотелось бы что бы при нажатии на кнопку его модальность прерывалась и можно было вернуться в приложение и выпонить какие либо действия, (например селектировать что либо и т.п.).
Ну и по окончании продолжить диалог.
Простое решение выходить с каким либо кодом потом запускать диалог заново только кажется простым . Было уже опробовано.
Хтоелось бы написать свой класс наследованный от CDialog в котором есть 2 метода — прервать модальность, продолжить ее.
Посмотрел исходники CDialog. Вроде все понятно, т.е. можно прервать текущий ModalLoop, потом запустить новый. Но хотелось именно продолжить старый... Вобщем есть варианты этого кода но в итоге есть проблемы.
Такое возможно, есть библиотека где это реализовано, но ее к сожелению по определенным причинам везде с собой не поташишь...
Здравствуйте SirAlex, Вы писали:
SA>Хтоелось бы написать свой класс наследованный от CDialog в котором есть 2 метода — прервать модальность, продолжить ее.
Такое частично уже написано, EndModalLoop . Только нет продолжения и тд.
SA>Посмотрел исходники CDialog. Вроде все понятно, т.е. можно прервать текущий ModalLoop, потом запустить новый. Но хотелось именно продолжить старый... Вобщем есть варианты этого кода но в итоге есть проблемы.
Есть способ — делаешь немодальный диалог, вешаешь хук AfxHookWindowCreate(this);
Он устанавливает m_pWndInit на твой диалог. Потом вызываешь RunModalLoop,и у тебя появляется модальность. По нажатию на батон или еще как вызываешь EndModalLoop — . Теперь немодалныйснова и сообщения получаем от глобального цикла. Потом снова запускаешь в своем диалоге RunModalLoop и все.
Другой способ. В DoModal выполняется CWnd::RunModalLoop — он выбирает сообщения из очереди, а паренту посылает WM_ENTERIDLE, WM_KICKIDLE и тд. Тебе нужно это заменить. Переписывая DoModal, PreModal,PostModal — они виртуальные. Нужно будет кучу проверок делать. Но это несколько неудобный способ. Все из-за того, что DoModal должен ожидать результата.
D>Другой способ. В DoModal выполняется CWnd::RunModalLoop — он выбирает сообщения из очереди, а паренту посылает WM_ENTERIDLE, WM_KICKIDLE и тд. Тебе нужно это заменить. Переписывая DoModal, PreModal,PostModal — они виртуальные. Нужно будет кучу проверок делать. Но это несколько неудобный способ. Все из-за того, что DoModal должен ожидать результата.
Здравствуйте SirAlex, Вы писали:
SA>Написал переопределив DoModal
SA> + 2 метода — BeginModeless, CompleteModeless где соответсвенно EndModalLoop,EnableModalless и т.п. SA>В результате DoModal ждет результата....
Так я не понял, тебе нравится твой способ или нет ?
Здравствуйте SirAlex, Вы писали:
SA>Здравствуйте Dutchman, Вы писали:
Слушай, я тут прочитал, что можно убрать все это, если парент не дизаблить. DoModal дизаблит парент, а тебе только и надо добавить управление этим. Причем переписывать ничего не надо.
Q257812
D>>Другой способ. В DoModal выполняется CWnd::RunModalLoop — он выбирает сообщения из очереди, а паренту посылает WM_ENTERIDLE, WM_KICKIDLE и тд. Тебе нужно это заменить. Переписывая DoModal, PreModal,PostModal — они виртуальные. Нужно будет кучу проверок делать. Но это несколько неудобный способ. Все из-за того, что DoModal должен ожидать результата.
SA>Написал переопределив DoModal
SA>там вместо
SA>... SA>RunModalLoop SA>...
SA>написал (это упрощенный пример):
SA>do{ SA> if(m_bModeless){ SA> .... SA> bModelessSeted = true; SA> ::SendMessage(m_hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd); SA> .... SA> } else { SA> bModelessSeted = false; SA> RunModalLoop SA> } SA> SA>}while(m_bModeless || bModelessSeted);
SA> + 2 метода — BeginModeless, CompleteModeless где соответсвенно EndModalLoop,EnableModalless и т.п. SA>В результате DoModal ждет результата....