プログレスバーが増加している間にラベルを変更していきたいのですが
どのようにやっても変更されません。
ソースのどの部分が悪いのでしょうか。
// プログレスバーダイアログの作成
CProgressDialog pd;
pd.m_Label = "プログレスバーテスト中...";
pd.Create(IDD_PROGRESS_DIALOG);
pd.m_ProgressBar.SetRange(0,10);
int i=0;
while(i <= 10){
// プログレスバーを更新する
Sleep(1000);
pd.m_ProgressBar.SetPos(i);
pd.m_Label = "更新中";
i++;
}
// プログレスダイアログを消去する
pd.DestroyWindow();
Createの後のどの部分でやっても変更されません。
何か良い方法があればお教え下さい。
お願い致します。
CProgressDialogの実装がどうなってるのか分からないので、答え様が無いです。
その実装こそがポイントだと思いますんで・・・
とりあえず、下記URLに掲載されているサンプルを以下の様にいじったら出来ますが・・・
http://www.sado.co.jp/system/taka/progress/
DWORD CMyProgressDialog::ProgressProc()
{
char buf[64];
SetMessage("作業中です...");
for (int i=0;i<100;i++) {
if (IsCancel()) break;
Sleep(100);
SetProgress(i);
sprintf(buf,"作業中です...(%03d%%)",i);
SetMessage((const char *)buf);
}
return 0;
}
Toshiさんありがとうございます。
以下の通りにCProgressDialogを実装しました。
↓
http://hp.vector.co.jp/authors/VA036850/airpark/tips/#progress
私が示したサンプルを見れば、どこが悪いのかお分かりですね?
m_Label と言うのは、単なる文字列変数で、初期起動時は initDialog で
m_Label の内容が画面に反映されるから良いのですが、処理中では、当然
反映されません。どうやって反映させれば良いのかは、上記サンプルと、
貴方のコードをじっくりと見比べればすぐに分かると思います。
Toshiさんありがとうございます。
sprintf(buf,"作業中です...(%03d%%)",i);
↑
これを使うって事ですか?
それとも、マルチスレッドにするって事ですか?
難しいな・・・
C++ や Win32API の知識はある程度有ると言う前提で書いてます。
もし、サンプルのソースを読めないなら、C++の仕様や、Win32APIの仕様再確認
が必要です。
私が示したサンプルでは、m_Label にあたるメンバ変数を CStaticクラスで
定義し、SetMessage() メンバ関数でラベルを更新してるって事です。
注意点としては、SetWindowText()を使いますので、Create後じゃないと使えない
って事です。
この説明でも理解が得られない場合、私が示したサンプルを素直に使ってください。
m_Labelの変更を反映したいタイミングにUpdateData(FALSE)を追加すればいいと思いますが・・・
#私的にはm_LabelはCStatic型にしてm_Label.SetWindowTextで変更しますが
Toshiさん、fukuさんありがとうございます。
なんとか完成できました。
違う方法でも作る事もできました。
ありがとうございました。