プログレスバーというのは進捗状況をユーザに見せるために使いますが、この進捗がいつ終わるか分からない Indeterminate(不確定)な場合には、マーキースタイルのプログレスバーが役に立ちます。
![IndeterminateProgressBar.gif](http://melt.wankuma.com/IndeterminateProgressBar.png)
↑こんなプログレスバーのことです。
このプログレスバーを作るためには、C# であれば
progressBar.Style = ProgressBarStyle.Marquee;
これだけで出来ますが、これを C++ で行う方法を調べてみました。
まずはどこかで InitCommonControlsEx を呼び出してプログレスバーを初期化しておきます。
これは1回だけ呼び出せば十分ですが、別に何回も呼び出しても構いません。
INITCOMMONCONTROLSEX ic = { sizeof(INITCOMMONCONTROLSEX) };
ic.dwICC = ICC_PROGRESS_CLASS;
::InitCommonControlsEx(&ic);
で、マーキースタイルを使用するためにはプログレスバーのウインドウスタイルに PBS_MARQUEE を指定する必要があるので、CreateWindow や CreateWindowEx でウインドウを作成するときに引数の dwStyle に PBS_MARQUEE を指定するか、SetWindowLongPtr を使ってウインドウスタイルをセットするか、もしくはリソーススクリプト(*.rc)の中で PBS_MARQUEE スタイルを追加してやればいいです。
HWND hProgress = ::CreateWindow(_T("msctls_progress32"), _T("Progress"),
WS_BORDER | PBS_MARQUEE, x, y, w, h, hParent, NULL, hInstance, NULL);
LONG_PTR style = ::GetWindowLongPtr(hProgress, GWL_STYLE);
::SetWindowLongPtr(hProgress, GWL_STYLE, style | PBS_MARQUEE);
CONTROL "",IDC_PROGRESS,"msctls_progress32",
WS_BORDER | 0x8,37,84,114,12,WS_EX_TOPMOST | 0x50000000L
↑このスタイル(PBS_MARQUEE)を追加
これで準備完了です。
あとはこれを動かすだけで、そのためには SendMessage で PBM_SETMARQUEE を指定します。
wParam には再生(TRUE)か停止(FALSE)を、lParam にはマーキーの表示速度をミリ秒で指定します。
::SendMessage(hProgress, PBM_SETMARQUEE, TRUE, 100);
これであとはメッセージの処理をちゃんと行えば、マーキーが表示されます。