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

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

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

Re[8]: ファイルアイコンを取得し、リストビューに表示


(過去ログ 59 を表示中)

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

■33926 / inTopicNo.1)  ファイルアイコンを取得し、リストビューに表示
  
□投稿者/ hide123 (1回)-(2009/03/13(Fri) 14:25:39)

分類:[C#] 

環境
・WindowsXP
・Visual C# 2008 Express Edition

お世話になります。
ファイルアイコンを取得し、そのアイコンをリストビューに表示させたいのですが、
リストビューに表示されずに困っています。どこがわるいか指摘頂けないでしょうか。
よろしくお願いします。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Windows;
using System.Runtime.InteropServices;
using System.IO;

namespace IconExtract
{
    public partial class Form1 : Form
    {
        // --------------------------------------------
        // アイコン取得用のWin32 API
        // --------------------------------------------
        // SHGetFileInfo関数
        [DllImport("shell32.dll")]
        private static extern IntPtr SHGetFileInfo
            (string pszPath, 
             uint dwFileAttributes, 
             ref SHFILEINFO psfi, 
             uint cbSizeFileInfo, 
             uint uFlags);

        // SHGetFileInfo関数で使用するフラグ
        private enum shfileflg
        {
            SHGFI_ICON              = 0x000000100,
            SHGFI_DISPLAYNAME       = 0x000000200,
            SHGFI_TYPENAME          = 0x000000400,
            SHGFI_ATTRIBUTES        = 0x000000800,
            SHGFI_ICONLOCATION      = 0x000001000,
            SHGFI_EXETYPE           = 0x000002000,
            SHGFI_SYSICONINDEX      = 0x000004000,
            SHGFI_LINKOVERLAY       = 0x000008000,
            SHGFI_SELECTED          = 0x000010000,
            SHGFI_ATTR_SPECIFIED    = 0x000020000,
            SHGFI_LARGEICON         = 0x000000000,
            SHGFI_SMALLICON         = 0x000000001,
            SHGFI_OPENICON          = 0x000000002,
            SHGFI_SHELLICONSIZE     = 0x000000004,
            SHGFI_PIDL              = 0x000000008,
            SHGFI_USEFILEATTRIBUTES = 0x000000010
        };

        // SHGetFileInfo関数で使用する構造体
        private struct SHFILEINFO
        {
            public IntPtr hIcon;
            public IntPtr iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        };

        public Form1()
        {
            InitializeComponent();
        }

        public static void main()
        {
            // アイコンを取得
            SHFILEINFO shinfo = new SHFILEINFO();
            uint flg;
            flg = (uint)(shfileflg.SHGFI_ICON | shfileflg.SHGFI_LARGEICON);
            IntPtr hSuccess = SHGetFileInfo("c:\\test.log", 
                                            0,
                                            ref shinfo, 
                                            (uint)Marshal.SizeOf(shinfo), 
                                            flg);
            if (hSuccess != IntPtr.Zero)
            {
                Icon appIcon = Icon.FromHandle(shinfo.hIcon);
                imageList1.Images.Add(appIcon);
                listView1.LargeImageList = imageList1;
            }
        }
    }
}

引用返信 編集キー/
■33927 / inTopicNo.2)  Re[1]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO (749回)-(2009/03/13(Fri) 14:34:12)
No33926 (hide123 さん) に返信

まさかとは思うけど、Application.Run してないからとか?
引用返信 編集キー/
■33928 / inTopicNo.3)  Re[2]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO (750回)-(2009/03/13(Fri) 14:43:52)
もしかして main って Main とは別物ですか?
引用返信 編集キー/
■33929 / inTopicNo.4)  Re[2]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 (2回)-(2009/03/13(Fri) 14:46:21)
No33927 (.SHO さん) に返信
> ■No33926 (hide123 さん) に返信
>
> まさかとは思うけど、Application.Run してないからとか?

いえ、別ファイル(Program.cs)にて行っています。

引用返信 編集キー/
■33930 / inTopicNo.5)  Re[3]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO (751回)-(2009/03/13(Fri) 14:50:37)
ListView に ImageList を登録しただけで、データを入れてないから?
引用返信 編集キー/
■33931 / inTopicNo.6)  Re[3]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 (3回)-(2009/03/13(Fri) 14:52:03)
No33928 (.SHO さん) に返信
> もしかして main って Main とは別物ですか?

大変失礼しました。わかりにくいと思い、ボタン押下時の処理をmain(Mainが正)に変更しました。
リストビューにアイコンを設定する箇所か、もしくはリストビューコントロールプロパティの設定
がおかしいのかなとは思っているのですが・・・。


引用返信 編集キー/
■33932 / inTopicNo.7)  Re[4]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 (5回)-(2009/03/13(Fri) 14:56:35)
No33930 (.SHO さん) に返信
> ListView に ImageList を登録しただけで、データを入れてないから?

試しに下記のようにピクチャボックスに設定してみたところ
アイコンが表示されましたのでデータはあると思っているのですが。

this.pictureBox1.Image = appIcon.ToBitmap();
引用返信 編集キー/
■33933 / inTopicNo.8)  Re[5]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO (752回)-(2009/03/13(Fri) 15:00:39)
> 試しに下記のようにピクチャボックスに設定してみたところ
> アイコンが表示されましたのでデータはあると思っているのですが。
>
> this.pictureBox1.Image = appIcon.ToBitmap();

ImageList のデータじゃなくて ListView のデータです。
引用返信 編集キー/
■33934 / inTopicNo.9)  Re[6]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO (753回)-(2009/03/13(Fri) 15:16:25)
ImageList は ListView に登録したデータに関連付けるイメージを登録するだけで
それだけでは、何も表示されません。

ListView にデータを登録し、そのデータを ImageList と対応付けて始めて
アイコンが表示されます。

引用返信 編集キー/
■33935 / inTopicNo.10)  Re[7]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 (6回)-(2009/03/13(Fri) 15:28:27)
No33934 (.SHO さん) に返信
> ImageList は ListView に登録したデータに関連付けるイメージを登録するだけで
> それだけでは、何も表示されません。
>
> ListView にデータを登録し、そのデータを ImageList と対応付けて始めて
> アイコンが表示されます。
>

ありがとうございます。

ListView にデータを登録とは前もってListViewItemを登録しておくという
ことでしょうか。
引用返信 編集キー/
■33936 / inTopicNo.11)  Re[8]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO (754回)-(2009/03/13(Fri) 15:36:12)
No33935 (hide123 さん) に返信

> ListView にデータを登録とは前もってListViewItemを登録しておくという
> ことでしょうか。

「前もって」じゃなくていいです。
つか、前もって登録しておくのは ImageList の方です。
引用返信 編集キー/
■33937 / inTopicNo.12)  Re[7]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 (7回)-(2009/03/13(Fri) 15:37:24)
No33934 (.SHO さん) に返信
> ImageList は ListView に登録したデータに関連付けるイメージを登録するだけで
> それだけでは、何も表示されません。
>
> ListView にデータを登録し、そのデータを ImageList と対応付けて始めて
> アイコンが表示されます。
>

下記のようにListViewItemを登録してみたところ表示されました。

Icon appIcon = Icon.FromHandle(shinfo.hIcon);
imageList1.Images.Add(appIcon);
listView1.LargeImageList = imageList1;
listView1.Items.Add(new ListViewItem("", 0)); ←


引用返信 編集キー/
■33938 / inTopicNo.13)  Re[8]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO (755回)-(2009/03/13(Fri) 15:39:25)
No33937 (hide123 さん) に返信

> 下記のようにListViewItemを登録してみたところ表示されました。

で?
OKですか?解決?
引用返信 編集キー/
■33939 / inTopicNo.14)  Re[9]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 (8回)-(2009/03/13(Fri) 15:41:47)
2009/03/13(Fri) 15:44:14 編集(投稿者)

下記について問題があれば申し訳ありませんがご指摘をお願いします。
listView1.Items.Add(new ListViewItem("", 0));

また、この延長上の話になってしまうのですが、ファイルアイコンではなく、
システムアイコンを取得する方法はないでしょうか。
引用返信 編集キー/
■33940 / inTopicNo.15)  Re[10]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ .SHO (756回)-(2009/03/13(Fri) 15:47:24)
No33939 (hide123 さん) に返信

> 下記について問題があれば申し訳ありませんがご指摘をお願いします。
> listView1.Items.Add(new ListViewItem("", 0));

アイコンだけ表示したいなら、それで問題ないです。

> また、この延長上の話になってしまうのですが、ファイルアイコンではなく、
> システムアイコンを取得する方法はないでしょうか。

APIなら出来そうだけど。
つか、C:\WINDOWS\system32\shell32.dll とか C:\WINDOWS\system32\shell.dll
とか指定すればいいのでは?
引用返信 編集キー/
■33941 / inTopicNo.16)  Re[11]: ファイルアイコンを取得し、リストビューに表示
□投稿者/ hide123 (10回)-(2009/03/13(Fri) 16:52:40)
下記のAPIを使用して実現することができました。
色々とアドバイス頂きありがとうございました。
また何かありましたらよろしくお願いします。


// ---------------------------------------
// 宣言部
// ---------------------------------------
[DllImport("shell32.dll")]
private static extern uint ExtractIconEx(
string lpszFile,
int nIconIndex,
IntPtr[] phiconLarge,
IntPtr[] phiconSmall,
uint nIcons
);

// ---------------------------------------
// ソース抜粋
// ---------------------------------------
string path = "C:\\Windows\\System32\\shell32.dll";

// 対象ファイル内アイコン総数を取得
uint tCnt = ExtractIconEx(path, -1, (IntPtr[])null, (IntPtr[])null, 0);
IntPtr[] sIcon = new IntPtr[tCnt]; // 小さいアイコン
IntPtr[] lIcon = new IntPtr[tCnt]; // 大きいアイコン
// 表示するアイコンを取得
uint getCnt = ExtractIconEx(path, 0, lIcon, sIcon, tCnt);

for (int i = 0; i < getCnt; i++)
{
Icon appIcon = Icon.FromHandle(lIcon[i]);
imageList1.Images.Add(appIcon);
listView1.LargeImageList = imageList1;
listView1.Items.Add(new ListViewItem("", i));
}


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -