Перенаправление сообщений в окно
От: _agg  
Дата: 24.07.19 07:18
Оценка:
Всем привет, достался код требующий модификации, есть приложение SDI, в какой-то момент его работы показывается предварительный просмотр, а после распечатки документа или закрытия предварительного просмотра, нужно показать сообщение(MessageBox), и вот собственно вопрос, как мне выкрутится что бы не переписывать много кода остановить выполнение пока существует окно предварительного просмотра, пробовал так:
Print();  //окно предварительного просмотра для печати появилось
//попытка дождаться завершения работы с предварительным просмотром
while (dynamic_cast<CXpsView*>(GetActiveView())) {       // выполнять пока CXpsView является активным окном
    MSG msg;
    if (::PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {    //пытаюсь получить и обработать
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);
    }
    Sleep(1);
}

MessageBox(...);  // появляется сообщение



по факту в цикле он остается но XpsView ничего не получает, просто зависает, пробовал еще такой вариант:
pXpsView->PostMessage(msg.message, msg.wParam, msg.lParam);      // тоже не работает



Вразумите кто знает как это сделать?
Re: Перенаправление сообщений в окно
От: Stanislav V. Zudin Россия  
Дата: 24.07.19 07:33
Оценка:
Здравствуйте, _agg, Вы писали:

_>Всем привет, достался код требующий модификации, есть приложение SDI, в какой-то момент его работы показывается предварительный просмотр, а после распечатки документа или закрытия предварительного просмотра, нужно показать сообщение(MessageBox), и вот собственно вопрос, как мне выкрутится что бы не переписывать много кода остановить выполнение пока существует окно предварительного просмотра


А что, добавить код в метод virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); не помогает?
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: Перенаправление сообщений в окно
От: _agg  
Дата: 24.07.19 07:46
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>А что, добавить код в метод virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); не помогает?


Добавить и опираться на это событие значит переписать весь алгоритм, потому что, то что я описал это только часть его, и переделывать его весь очень накладно по времени.
Re: Перенаправление сообщений в окно
От: _agg  
Дата: 25.07.19 08:22
Оценка:
Здравствуйте, _agg, Вы писали:

Примерно понял почему зависает, весь этот большой алгоритм начинает исполняться из MainFrm::PreTranslateMessage, и обработчиком View предварительного просмотра после его появления становиться тот же MainFrm::PreTranslateMessage, есть ли какая-нибудь возможность дать обработаться новой View пока не закроется? Пробовал вот так:
while (dynamic_cast<CXpsView*>(GetActiveView())) {       // выполнять пока CXpsView является активным окном
    MSG msg;
    if (::PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {    //пытаюсь получить и обработать
        CFrameWndEx::PreTranslateMessage(&msg);
    }
    Sleep(1);
}


Так тоже не работает, подскажите пожалуйста как обыграть эту ситуацию? По сути мне нужна модальная View что бы исполнение кода продолжилось после того как закрылась эта View
Отредактировано 25.07.2019 11:28 _agg . Предыдущая версия .
Re[2]: Перенаправление сообщений в окно
От: Pavel Dvorkin Россия  
Дата: 25.07.19 11:52
Оценка:
Здравствуйте, _agg, Вы писали:

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


_>Примерно понял почему зависает, весь этот большой алгоритм начинает исполняться из MainFrm::PreTranslateMessage, и обработчиком View предварительного просмотра после его появления становиться тот же MainFrm::PreTranslateMessage, есть ли какая-нибудь возможность дать обработаться новой View пока не закроется?


Что если перегрузить PreTranslateMessage, и при активном View не пропускать сообщения родителю ?
With best regards
Pavel Dvorkin
Re[3]: Перенаправление сообщений в окно
От: _agg  
Дата: 30.07.19 03:16
Оценка:
Здравствуйте, парадокс в том что весь этот большой алгоритм и начинает свою работу из PreTranslateMessage, поэтому я и пытался дождаться окончания работы с View вызовом PreTranslateMessage(&msg) у базового класса:
if (::PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {    //пытаюсь получить и обработать
        CFrameWndEx::PreTranslateMessage(&msg);



Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Что если перегрузить PreTranslateMessage, и при активном View не пропускать сообщения родителю ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.