C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 任意のフォルダのアイコンを取得するには。


(過去ログ 18 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■6991 / inTopicNo.1)  任意のフォルダのアイコンを取得するには。
  
□投稿者/ 小西 (1回)-(2007/08/28(Tue) 14:24:06)

分類:[VB.NET/VB2005] 

こんにちは。

XPproのVB2005エクスプレスでWindowsアプリを作っています。
フォルダのアイコンを取得したいと思うのですが、見つけられません。
ローカルディスクとかマイドキュメントなどのアイコンを取得したいです。

ファイルは
Dim FileIcon As Icon = System.Drawing.Icon.ExtractAssociatedIcon(path)
で出来たのですが、フォルダの場合はどうしたらよいでしょうか?

宜しくお願い致します。

引用返信 編集キー/
■6995 / inTopicNo.2)  Re[1]: 任意のフォルダのアイコンを取得するには。
□投稿者/ シャノン (206回)-(2007/08/28(Tue) 15:37:18)
No6991 (小西 さん) に返信
> こんにちは。
>
> XPproのVB2005エクスプレスでWindowsアプリを作っています。
> フォルダのアイコンを取得したいと思うのですが、見つけられません。
> ローカルディスクとかマイドキュメントなどのアイコンを取得したいです。
>
> ファイルは
> Dim FileIcon As Icon = System.Drawing.Icon.ExtractAssociatedIcon(path)
> で出来たのですが、フォルダの場合はどうしたらよいでしょうか?

.NET Framework には該当する機能はありません。
Windows API の SHGetFileInfo という関数を使います。
サンプルは以下を参照してください。
http://support.microsoft.com/kb/319350/ja

ところで、マイドキュメントは実はフォルダではありません。
C:\Documents and Settings\<UserName>\My Documents というパスを SHGetFileInfo に渡しても、普通のフォルダのアイコンが返るだけで、デスクトップにあるマイドキュメントのアイコンは取得できません。
この場合のサンプルは後で追記しますので、ちょっとお待ちください。
引用返信 編集キー/
■7005 / inTopicNo.3)  Re[2]: 任意のフォルダのアイコンを取得するには。
□投稿者/ 小西 (3回)-(2007/08/28(Tue) 17:23:41)
ありがとうございます。

> ところで、マイドキュメントは実はフォルダではありません。

言われるまで深く考えてなかったですが、そういえばそうですね。
ちょっと感動というか、勉強になります。

宜しくお願い致します。

引用返信 編集キー/
■7032 / inTopicNo.4)  Re[1]: 任意のフォルダのアイコンを取得するには。
□投稿者/ YAS (16回)-(2007/08/29(Wed) 11:00:21)
> フォルダのアイコンを取得したいと思うのですが、見つけられません。
> ローカルディスクとかマイドキュメントなどのアイコンを取得したいです。

アイコンのイメージが欲しいだけなら,

C:\WINDOWS\system32\Shell32.dll

にもろもろのアイコンが含まれていますので,そこから取得すればよいと思います。
引用返信 編集キー/
■7043 / inTopicNo.5)  Re[3]: 任意のフォルダのアイコンを取得するには。
□投稿者/ 渋木宏明(ひどり) (323回)-(2007/08/29(Wed) 12:25:53)
渋木宏明(ひどり) さんの Web サイト
>>ところで、マイドキュメントは実はフォルダではありません。
>
> 言われるまで深く考えてなかったですが、そういえばそうですね。
> ちょっと感動というか、勉強になります。

「デスクトップ」もそうだし、「ネットワーク」フォルダ等々もそうです。
実際には実在するどこかのフォルダの内容を反映しているものもありますが、エクスプローラでの表示と実体のフォルダの位置は一致してなかったりします。

こういうやつも含めて、エクスプローラに表示されているブツはすべて「シェルオブジェクト」と呼ばれる抽象的なブツなんです。

たぶん、現状は Directory.GetFile() とかでファイルを列挙しているんでしょうが、その路線でいくと「エクスプローラの表示や動作、あるいはその両方を忠実に模倣」しようとするといつかどん詰まりになります。

本格的に、エクスプローラが表示しているのと同じファイルアイコンを表示したいなら、Windows SDK で定義されている IShellFolder, IShellIcon などのインターフェースを利用して取得することになります。

ただし、こういったことをやろうとすると COM を扱うことになるので COM に関する基礎知識は必須ですし、「.NET で COM を扱うことの独特の難しさ」についても理解が必要です。

また、Directory.GetFiles() でみつけた個々のファイルに対して、毎回異なるアイコンを作成してツリービューに階層表示していたりすると、いつかメモリ他の資源を食いつぶしてしまいます。

修作ならともかく、リリースものであるならそういった安直な実装は避けるべきでしょう。

エクスプローラは、複数 explorer.exe 間および他アプリケーションと共有できるように、Win32 レベルの ImageList を公開しています。

ファイル/フォルダアイコンの乱造による資源の枯渇を避けるにはこれを使うのが最も有効なんですが、.NET の ImageList は Win32 の ImageList を素直にラップした作りになっていないので、マジメな実装を実現するのが非常に面倒なのが頭の痛いところです。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -