まいど、お世話になります。
ある処理を実行中にプログレスバーのついたダイアログを表示して
処理の実行状況を表示したいのですが、
処理実行中に画面が固まってしまって画面を再更新できません。
そこで、ダイアログアイテムの画面表示の再更新方法を
ご存知の方におしえていただきたいと思います。
現在以下の方法で処理を行っています。
CIPRGDlg* pclDlg;
pclDlg = new CIPRGDlg; //プログレスバーを表示するダイアログ
pclDlg->Create(IDD_PRG); //ダイアログの作成
pclDlg->m_nRangeMax = nHistory; //プログレスバーの最大値を設定
pclDlg->ShowWindow( TRUE ); //ダイアログを表示
pclDlg->m_ctrlProgress.SetPos( 0 ); //プログレスバーの初期化
for ( int ni = 0; ni < nHistory; ni++ ) {
pclDlg->StepUp(); //プログレスバーのステップアップ処理
/* ここで処理を行います */
}
pclDlg->SendMessage( WM_CLOSE ); //処理終了後ダイアログを閉じます
delete pclDlg; //オブジェクトを破棄します
んで、StepUp()の処理は以下のとおりにやっています。
void CIPRGDlg::StepUp()
{
m_ctrlProgress.StepIt();
}
↑こんな感じなのですが、何かが足りないのでしょうか?
よろしくお願いいたします。
こんにちは。
画面が固まるということはforループの処理に占有されて
その間に発生したメッセージの処理が出来ない状態に
なっているということです。
処理をしているforループに以下のコードを加えてみてください。
MSG msg;
while ( ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {
::TranslateMessage( &msg );
::DispatchMessage ( &msg );
}
本格的にやるならスレッドを利用してください。
ではでは。
回答ありがとうございます。
なるほど,確かにHALさんが示していただいたコードで
画面が固まることは解消されました。
これでforループ中にもメニューなどの操作もできるようになりました。
ただ、画面の再更新がなされてなかったのは、
私のミスでプログレスバーの最大値を設定に失敗していたようです。
この部分を修正することで問題は解決しました。
でも、大変役に立つことを教えていただきありがとうございました。
これは他でも使えそうですね。