Tech Notes

ListViewをエクスプローラ風に

WindowsアプリをC++で作るたびこれのやり方を思い出すのに時間を食っている気がするので、いい加減メモすることにした。初めてやったときはYahoo知恵袋で質問してやり方を知ったのだが、その質問の日付を見たら5年前(小6のとき)だったので俺何の進歩もねぇ~という感慨を感じる。

やる必要のあることは以下の3つ。

hListはListViewのウィンドウハンドル。

  • SetWindowTheme(hList, L"Explorer", NULL)でListViewのThemeを設定する。UxTheme.hおよびUxTheme.libが必要。

なお、実際にはSetWindowThemeAとSetWindowThemeWがあってマクロで振り分けられているとかそういうのはなくって、元からSetWindowThemeだけで引数がLPCWSTR型なのでL"Explorer"のままでOK。_T("Explorer")とかやるとマルチバイト文字セットの設定でコンパイルしたときにエラーが出る。

  • ListView_SetExtendedListViewStyle(hList, LVS_EX_FULLROWSELECT)で拡張スタイルを設定。CommCtrl.hが必要。

この「拡張スタイル」は、CreateWindowExとかSetWindowLongPtrとかで指定できる「拡張ウィンドウスタイル」とは別物で、リストビューコントロールなどの一部のコントロールが持っている独自のもの。そのため LVS_EX_FULLROWSELECTを拡張ウィンドウスタイルとしてリストビューに設定しても何の意味もないので注意。ListView_SetExtendedListViewStyleマクロの中身を見るとリストビューにSendMessageしていることが分かる。

  • ビジュアルスタイルのマニフェストを設定。以下のコードをソースコードのどこかに入れる。
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif

ネットではmanifest.xmlでやる方法も紹介されているが、32ビット版/64ビット版の両方へのコンパイルに対応させるのが若干ゃめんどくさいしファイルも増えて汚くなるので、個人的にはこの方法を推奨。

ちなみに参考文献ではInitCommonControls()を呼ぶことが指示されているが、実験してみたところ呼ばなくても大丈夫な模様。ミニマリストはもしかしたら省略してもいいかもしれない。

でも呼ぶに越したことはないので、自分は一応WinMainの頭あたりに入れておく。

参考:

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1099846860

http://gurigumi.s349.xrea.com/programming/visualcpp/sdk_luna.html

https://social.msdn.microsoft.com/Forums/vstudio/en-US/bddad9ee-942b-477a-a3a0-18e14a995d89/64bit-manifest-problem-side-by-side-issue?forum=vcgeneral