Не показывается диалог, использующий AtlWaitWithMessageLoop
От: baily Россия  
Дата: 02.09.05 10:55
Оценка:
Добрый день!
Столкнулся со следующей проблемой.

Есть прогресс-диалог, который показывается, пока не освободится некоторое событие.
Освобождение события диалог ждет с помощью функции 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 ), то все в порядке.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.