第 号
|
Last Updated 2005/04/25
|
プログレスダイアログ
ダイアログにて進行状況を確認させるにはプログレスダイアログを表示すれば
よい.プログレスダイアログは 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;
}
}
}
2002/05/23
参照
中止ダイアログ
メッセージポンプ