|
プログレスバーの基本
プログレスバーは、時間のかかる処理の実行中に経過状況を表示するためのコントロールです。
ではまず、リソースエディタでプログレスバーを追加しましょう。今回はプログレスバーとボタンを追加しました。"開始"ボタンが押されたら、時間のかかるファイル出力処理を実行し、プログレスバーに進行状況を表示します。

プログレスバーの操作は、CProgressCtrlクラスの関数を使って行うので、Control型のDDX変数を追加すると操作が楽になります。プログレスバーを右クリックし、「変数の追加」を選択します。

アクセスはprivate、「コントロール変数」をチェックし、カテゴリにControlを選択します。変数のデータ型はCProgressCtrlにします。

変数名はメンバ変数となるのでm_で始まる名前にしましょう。さらにDDXのControl変数であることがわかるようにm_xcで始まる名前にすると分かりやすくなります。この辺は好みで決めましょう。
ボタンにはBN_CLICKEDのイベントハンドラを追加します。では、実装の方を見てみましょう。"開始"ボタンが押されたときのイベントハンドラです。
// "開始"ボタン押下
void CProgressDlg::OnBnClickedBtnStart()
{
char byte = 1;
int i;
CFile file;
int err = 0;
if (!err)
{
if (!file.Open(_T("C:\\fileTest.dat"),
CFile::modeReadWrite | CFile::shareExclusive |
CFile::modeCreate)) err = 1;
}
if (!err)
{
// プログレスバー範囲設定
m_xcProgress.SetRange32(0, 100000 -1);
for (i = 0; i < 100000; i++)
{
// プログレスバー現在位置設定
m_xcProgress.SetPos(i);
TRY {file.Write(&byte, sizeof byte);}
CATCH (CFileException, eP) {err = 1;}
END_CATCH
if (err) break;
}
m_xcProgress.SetPos(0);
}
file.Close();
} |
処理自体に意味はありませんが、時間のかかる処理ということで、ファイルを作り1バイトずつひたすら書き込んでいきます。CFileクラスを使ったファイル操作については「ファイル入出力の基本」を見てください。
プログレスバーは、始めに範囲を設定します。指定しないと0〜100になります。設定はCProgressCtrl::SetRange32()関数を使います。
| void CProgressCtrl::SetRange32(int nLower, int nUpper); |
| 説明: |
プログレスバーの範囲を設定 |
| 引数: |
nLower :範囲の上限値
nUpper :範囲の下限値 |
| 戻り値: |
なし |
プログレスバーの現在の位置を設定するには、CProgressCtrl::SetPos()関数を使います。
| int CProgressCtrl::SetPos(int nPos); |
| 説明: |
プログレスバーの現在の位置を設定 |
| 引数: |
nPos :現在の位置 |
| 戻り値: |
直前の位置 |
では、ビルドして実行してみましょう。"開始"ボタンが押されたら、ファイル出力が実行されます。プログレスバーには進行状況を表示されます。

プログレスバーの基本的な使い方はこれだけですが、実際の使用場面は、プログレスバーを出しているダイアログと、時間のかかる処理は別スレッドで行うことが多いです。そうしないと、ダイアログが中断などの操作を受け付けなくなってしまうからです。そうするとスレッド間で進行状況の受け渡し処理や中断処理などが発生するので、もう少し複雑になってきます。
|