获取文件的图标_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 获取文件的图标

获取文件的图标

 2010/9/19 23:40:04  devilhand  http://devilhand.javaeye.com  我要评论(0)
  • 摘要:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;namespace获取文件的图标{publicpartialclassForm1:Form{[StructLayout
  • 标签:获取文件 图标
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace 获取文件的图标
{

    public partial class Form1 : Form
    {
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct SHFILEINFO
        {
            public IntPtr hIcon;
            public int iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        }

        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            using (Graphics g = this.pictureBox1.CreateGraphics())
            {
                g.Clear(this.pictureBox1.BackColor); //清除picturebox的背景色,为了画透明图标

                g.DrawIcon(GetIcon(this.textBox1.Text, false), 1, 1); //绘制小图标
            }

            using (Graphics g = this.pictureBox2.CreateGraphics())
            {
                g.Clear(this.pictureBox2.BackColor); //清除picturebox的背景色,为了画透明图标

                g.DrawIcon(GetIcon(textBox1.Text, true), 1, 1); //绘制小图标
            }
        }
        /// 
        /// 获取文件类型的关联图标
        /// 
        /// 文件类型的扩展名或文件的绝对路径
        /// 是否返回大图标
        /// 获取到的图标
        static Icon GetIcon(string fileName, bool isLargeIcon)
        {
            SHFILEINFO shfi = new SHFILEINFO();
            IntPtr hI;

            if (isLargeIcon)
                hI = NativeMethods.SHGetFileInfo(fileName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), NativeMethods.SHGFI_ICON | NativeMethods.SHGFI_USEFILEATTRIBUTES | NativeMethods.SHGFI_LARGEICON);
            else
                hI = NativeMethods.SHGetFileInfo(fileName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), NativeMethods.SHGFI_ICON | NativeMethods.SHGFI_USEFILEATTRIBUTES | NativeMethods.SHGFI_SMALLICON);

            Icon icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon;

            NativeMethods.DestroyIcon(shfi.hIcon); //释放资源
            return icon;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (openFileDialog1 .ShowDialog ()==DialogResult .OK )
            {
                textBox1.Text = openFileDialog1.FileName;
            }
        }

        class NativeMethods
        {

            [DllImport("Shell32.dll", EntryPoint = "SHGetFileInfo", SetLastError = true, CharSet = CharSet.Auto)]
            public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags);

            [DllImport("User32.dll", EntryPoint = "DestroyIcon")]
            public static extern int DestroyIcon(IntPtr hIcon);

            #region API 参数的常量定义

            public const uint SHGFI_ICON = 0x100;
            public const uint SHGFI_LARGEICON = 0x0; //大图标 32×32
            public const uint SHGFI_SMALLICON = 0x1; //小图标 16×16
            public const uint SHGFI_USEFILEATTRIBUTES = 0x10;

            #endregion

        }
    }

}

?

发表评论
用户名: 匿名