流れるプログレスバー
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を貼っ付けてお茶を濁しておきました。