Добрый день!
Столкнулся со следующей проблемой.
Есть прогресс-диалог, который показывается, пока не освободится некоторое событие.
Освобождение события диалог ждет с помощью функции AtlWaitWithMessageLoop, так-как
он должен обрабатывать события таймера, для изменения текущей позиции прогресса,
а также дать возможность закрыть диалог. Для этого я использую следующий код:
class CMyProgressDlg : public CDialog
{
....
};
BEGIN_MESSAGE_MAP(CMyProgressDlg, CDialog)
ON_WM_TIMER()
ON_COMMAND(ID_LONG_OP, OnLongOperation)
END_MESSAGE_MAP()
BOOL CMyProgressDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_pbProgress.SetRange32(0, 100);
m_pbProgress.SetPos(0);
m_nTimerID = SetTimer(1, 1000, NULL);
// Начинаем долгую операцию
PostMessage(WM_COMMAND, ID_LONG_OP);
return TRUE;
}
void CMyProgressDlg::OnTimer( UINT nIDEvent )
{
// Пока идет долгая операция, каждую секунду увеличиваем текущую позицию,
// но не более чем до 80
if( m_pbProgress.GetPos() < 80 )
{
m_pbProgress.StepIt();
}
else if( m_nTimerID != 0 )
{
KillTimer( m_nTimerID );
m_nTimerID = 0;
}
}
void CMyProgressDlg::OnLongOperation()
{
// Ждем освобождения некоторого события,
// При этом хотим, обрабатывать сообщения таймера, а также нажатие на кнопки OK и Cancel
AtlWaitWithMessageLoop(m_hEvent);
// Завершаем диалог
PostMessage(WM_COMMAND, IDOK);
}
Проблема состоит в том, что сам диалог почему то не показывается. Заменив вызов AtlWaitWithMessageLoop
на вызываемый в данной функции цикл сообщений
while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
приходим к тому же результату.
Если же функцию OnLongOperation запускать после создания диалога ( то есть убрав вызов PostMessage(WM_COMMAND, ID_LONG_OP);
из OnInitDialog и поставив его, например в OnTimer ), то все в порядке.