32ビットアイコンをListViewで表示

せっかく少し前にくVisualStudio .NETを購入したので、最近少しずつ自分の作りたいソフトを進めたり進めなかったりしている。いや、あんまり進んでない。ちなみに、言語はC#。

とりあえずまず作ろうと思ったのは、フォルダツリーと、フォルダ内のファイルを表示するビュワーの部分。TreeViewだのListViewだのImageListだのといったクラスを使ってあれやこれやとやろうと画策。最初は、もしかしたらエクスプローラーの雛型みたいな物でもあるのかなぁ…と思ってたのだけど、そういうのは無いのね…考えが甘かった。
そこでまず最初に取りかかったのは、「リストビューにファイルとその関連づけられたアイコンを表示させる方法」。…いや、自分でもWindowsプログラム初心者が取りかかる物にしては偏ってるなぁ、と思う。ただ、あんまり見栄えの良くないまま他の部分に取りかかると、その不完全な部分がデバッグする度に表示されてしまうわけだから、いつまでも魚の骨が喉に引っかかっるような、そんな印象を常に受け続けてしまうわけで、そんな事は耐えられない!…というわけで、見栄え優先。
とりえあず、ファイルアイコンを取得する方法は資料が多量に出てくるので、SHGetFileInfo関数だの、SHFILEINFO構造体だのといった物を使えばいいらしいということは、割とすぐ分かった。…もっとも、Windows API 関連の話があまり分からないので、ソースがよく理解できず、かなり長時間悩んでたけど。
で、この取得したアイコンをListViewと関連づけられたImageListに突っ込めばOK!…とはすんなり行かせてもらえなかった。表示されたアイコンのうち、32bitアイコンのアルファチャンネル部分(半透明の部分)が正しく表示されず、代わりに黒い影のような物が表示されていた。つまり、24bitでしか表示されていないわけだ(下図参照)。

20041202_win_1.png

この原因を、とにかく日本語英語問わずWeb上を探しまくって調べた。しかし、なかなかみつからない。ImageListのColorDepthはきちんと32bitに設定されているし、ListViewのアイコンだから、Graphicsはちょっと違う…ような気がする(確かに32bitアイコンは正しく表示されるけど)。そんなこんなで(恥ずかしながら)二日間ほど粘って必死で調べた。その結果見つかったのは、Windows Forums FAQというページの2.19の記述。これによると、どうやらmanifestファイルという物を用意するらしい。そのmanifestファイルという物が何なのかさっぱり分からなかったので調べてみると、資料が出るわ出るわ。

WILL – XP Visual Style を適用する
Windows XP の Luna スタイルに対応しよう

どうやら、プログラムをWindows XPのVisual Styleに対応させるための代物らしい。とにかく、この通りmanifestファイルを外部で用意してみると、見事正常にアイコンを表示させることができた。

20041202_win_2.png

はー、こんなことで良かったのか…。よく考えたら、アルファチャンネルを使ったスタイルが使えるのはWindows XPだけなのだから、このVisual Styleと関連づけて考えればすぐ見つかったのにな…。
しかし、32bitアイコン/アルファチャンネルの問題とWindows XPのスタイルを関連付けて説明する資料が、何故こんなにも見つけにくかったのか。理由は…想像だけど何となく分かる。恐らく多くの人は、Windows XPをLunaスタイル(デフォルトのスタイル)で使用していると思われる。しかしこのmanifestファイルを用意しないと、作ったアプリケーションだけがクラシックスタイルのウィンドウで表示されてしまうため、普通はこれが気になって、真っ先にこのスタイル設定を優先させると考えられる。結果、そこで32bitアイコンも使えるようになるため、普通はこのアルファチャンネル問題を意識する事は無い。一方自分は、あまりゴテゴテしたスタイルが好きではないし、重いので最初からWindows XPをクラシックスタイルで使用するようにしている。そのため、作られるアプリケーションウィンドウは他のウィンドウとの差が無いので、スタイル設定を意識せずにいた。この差が、問題を表面化させにくくしているのではないかと考えられる。

ふー、何かもう色々と疲れたよ…。

追記

静になって考えてみると、そういやIEのコンポーネントがあるぐらいだから、ファイルエクスプローラのコンポーネントみたいな物は普通持ってるよなぁ…と思って調べてみた。あー、ツールボックスのカスタマイズをすると、それっぽい物が出てくるのかな。とりあえず、後で確認。

21:57 追記
やっぱりできないのかな?Visual Basic用のコンポーネントはあるけど…。IEコンポーネントがあるんだから、ファイル用のエクスプローラコンポーネントを持ってても不思議じゃないと思うんだけどな…。


Posted by:

Posted At:

Modified At:

Category:

Tag:

コメント

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください