流れるプログレスバー

WindowsXPのファイル検索とかで表示されるブロックが左から右に流れるプログレスバーってどうやって表示させるんだろう?
伸びるやつじゃなくて。

ちょっと調べる。…正式名称を知らないので、どうやって検索したらよいものやら。
思いつくキーワードを色々ググるも見つからない。さらに調べる。
ん〜…どうやら、PBS_MARQUEEってやつがそれっぽい。サンプルは落ちてないかな…
サンプルも見つからないので、てきとーにやってみる。
VC++6.0 + WTL7.5のApp WizerdからDialog Basedで吐いたコード

class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>,
		public CMessageFilter, public CIdleHandler
{
public:
	CProgressBarCtrl m_progress;
	// (後略)

とでもしておいて、WM_INITDIALOGのハンドラ…OnInitDialogあたりで、

RECT rc; // rcはてきとーに初期化
m_progress.Create(m_hWnd, &rc, _T("Progress"), WS_CHILD | WS_VISIBLE | PBS_MARQUEE);

とする。
表示されたプログレスバーにPBM_SETMARQUEEを投げれば動かせるみたい。
WTLなら動かしたいタイミングで

m_progress.SetMarquee(TRUE);

とすればOKか。
…ひとまずビルド!!

…って、ビルドできないじゃん。
CommCtrl.hをよく見たら、

#if (_WIN32_WINNT >= 0x0501)
#define PBS_MARQUEE             0x08
#define PBM_SETMARQUEE          (WM_USER+10)
#endif      // _WIN32_WINNT >= 0x0501

とか書いてあってげんなり(´・ω・`)
仕方ないので、stdafx.hに

#define _WIN32_WINNT	0x0501

と書いて、再度ビルド!!実行!!
動いた。
どうやら、自分でタイマー作ったり何とかしなくても

m_progress.SetMarquee(FALSE);

とするまで自動で動き続けるみたい(WTLの場合)。


しかし、_WIN32_WINNT = 0x0501ってことはWindowsXP以上じゃないと使えないってことだよな?
…そういえば、Windows2000以前では、こういう動きをするプログレバー見たこと無かったかもしれない。
試しにWindows2000に持ってったら、やっぱり動かなかった。プログレスバーの枠が表示されるだけ。
あまり使えん…*1


仕方がないので、ajaxとかどうぶつの森*2とかのデータ読み込み中やMac OS Xの起動中に見かける、ぐるぐる回るアレ*3のaviを貼っ付けてお茶を濁しておきました。

*1:Win2k辺りまではサポートしたい

*2:最近ハマってるんでw

*3:Firefoxの右上にもあるよね