MFC   VC++   Visual Studio   Visual Studio   プログラミング

プログレスバーのMARQUEE

 プログレスバーをマーキー表示させる方法。
 マーキー表示とは、バーが端から徐々に埋まっていくのではなく、短いバーが繰り返しスライドするものです。

 まず、プログレスバーのスタイルをリソースエディタなら、プログレスバーのプロパティから「Marquee」の項目を「True」にする。
 動的作成ならスタイルに「PBS_MARQUEE」を設定する。

 ここで、このスタイルは、
#if (_WIN32_WINNT >= 0x0501)
#define PBS_MARQUEE             0x08
#endif       // _WIN32_WINNT >= 0x0501
 と宣言されている通り、Windows XP以降でしか有効にならない。
 さらに、コモンコントロールV6.0以降でしか動作しないので、文字セットをマルチバイトにした場合、意図的にV6.0を使うようにしないといけない。
 SetMarquee関数は文字セットをマルチバイトにした場合、コンパイルエラーになるので、
    m_progress.SendMessage(PBM_SETMARQUEE, (WPARAM)TRUE, (LPARAM)100);
とする。
 ここで、WPARAMにスタート/停止のBOOL値を、LPARAMに動作スピードのInterval値を入れる。

 使用場面は、何かの処理中に動作させることがほとんどだと思うので、
void CXXXlDlg::OnBnClickedButton()
{
    m_progress.SetMarquee(TRUE, 100);    // m_progressはメンバ変数
    while(...)
    {
        // 何らかの処理
    }
}
 としたいところですが、これだとOnBnClickedButtonを抜けない限りバーは動きません。
 そこで、while文の中に、
MSG msg;
if(PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
のように、メッセージポンプを動かすようにすれば一応動くのですが、ダイアログ上でカーソルをぐるぐる動かすなど、処理するメッセージが多かったり、一周の処理が長いとやはりうまく動きません。
 さらに、while文を抜けた後の通常の処理部分では止まってしまいます。

 それならどうやるのか?というと、マルチスレッドを使い、別スレッドでやりたい処理をするのがいいのでは?と思います。
 しかし、この関数内でWaitFor〜などで処理終了を待ってしまうと、結局、同様に待っている間メッセージポンプを動かさないとバーは動きません。

 以上のように、結論としては、とにかく、メインスレッドは動かしておかないとダメ!ということみたいです。
ランキングへ     posted by 遠雷 | Comment(0) | コントロール
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。