Last Updated 2002/05/23
Programming Tips Visual C++ MFC ダイアログ  索 引 
プログレスダイアログ
2002/05/23

ダイアログにて進行状況を確認させるにはプログレスダイアログを表示すればよい.プログレスダイアログは VC++ の「コンポーネントの挿入」にて行うか,自ら作成する.

ダイアログ表示中も進行状況のもととなる処理は行わなければならない.
別段マルチスレッドにする必要はなく,モードレスダイアログを作成して,メッセージキューを覗くだけでプログレスダイアログは作成できる.

処理中にはメッセージキューを覗くように,以下の関数を頻繁呼び出す.

    void MyDialog::PumpMessages()
    {
        MSG msg;
        // メッセージの処理
        while (::IsWindow(GetSafeHwnd()) &&
                       ::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (!IsDialogMessage(&msg)) {
                ::TranslateMessage(&msg);
                ::DispatchMessage (&msg);
            }
        }
    }


また,ダイアログの作成方法で間違えてはならないのは,モーダルではないので処理は流れるということである.
(DoModal() ではなく Create() を呼び出す)
以下のようなコードだと,ダイアログは一瞬で消えてなくなる.
(デストラクタで DestroyWindow() している為)

void RunDialog()
{
    CProgressDlg dialog;
    dialog.Create(this);
}


ダイアログのインスタンスをメンバなり,処理中には消えないスコープで宣言しなければならない.


void RunDialog()
{
    CProgressDlg dialog;
    dialog.Create(this);
    for ( int i = 0; i < 10; i++ ) {

        // ここに処理を記述

        dialog.StepIt();
        if ( dialog.CheckCancelButton() ) {
        // キャンセル時の後始末
            break;
        }
    }
}


参照
中止ダイアログ
メッセージポンプ
前後のTips
プログレスダイアログ

DSS ProgrammingTipsCGI Ver2.02