代码改变世界

用Treeview实现FolderBrowerDialog 和动态获取系统图标(运用了Win32 dll类库)

  随风浪迹天涯  阅读(1328)  评论(4编辑  收藏  举报

其实,FolderBrowerDialog 很好用呢,有木有啊亲。反正我特别的喜欢,微软大哥把这个浏览文件夹的东东封装的多好呀,可是遇到一个变态的客户就不好玩了。

事情是这样子的。我需要做一个下面的东东:

 
这个不难啊,然后就用FolderBrowerDialog这个神器,嗯 还不错,刚开始客户用了也很喜欢。
 
可是过了一段时间之后,客户说 要屏蔽右键功能,他不想让其他通过右键能打开或浏览文件夹,如下面 红色要给屏蔽。
 
我一开始以为只是一个参数问题,就爽快的答应了客户咯。可是啊后来找啊找 找到天荒地老也木有找到。。。放弃了,然后改用了TreeView。。结果,版本出来了,先截图:
 
好吧,确实很丑哦。。

虽然 这个时候,把右键点击功能给取消啦,但是接着用户提了三个要求:

1.需要系统自动匹配它的图标

2.要有磁盘容量的大小。。

好吧,然后最后修改一下。这里面用到了 Win32 dll的几个函数,确实很好用呢。。赞一个。。

结果如下:

核心代码是:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public 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;
        }
 
        [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);
 
 
        public const uint SHGFI_ICON = 0x100;
        public const uint SHGFI_LARGEICON = 0x0;
        public const uint SHGFI_SMALLICON = 0x1;
        public const uint SHGFI_USEFILEATTRIBUTES = 0x10;
 
        static Icon GetIcon(string fileName, bool isLargeIcon)
        {
            SHFILEINFO shfi = new SHFILEINFO();
            IntPtr hI;
 
            if (isLargeIcon)
                hI = MyDirectory.SHGetFileInfo(fileName, 0, ref shfi,
                     (uint)Marshal.SizeOf(shfi), MyDirectory.SHGFI_ICON | MyDirectory.SHGFI_USEFILEATTRIBUTES | MyDirectory.SHGFI_LARGEICON);
            else
                hI = MyDirectory.SHGetFileInfo(fileName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), MyDirectory.SHGFI_ICON | MyDirectory.SHGFI_USEFILEATTRIBUTES | MyDirectory.SHGFI_SMALLICON);
            Icon icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon;
            MyDirectory.DestroyIcon(shfi.hIcon);
            return icon;
        }

 很好懂呢,只需要在程序中调用一下就ok啦。

 

--------------------2013.8.6 modify--------------------

//Get Stroage Path
    private void btnOpenFolder_Click(object sender, EventArgs e)
    {
      string storagePath = WinFileManage.OpenFolderAndGetPath(this);
      if (storagePath != "")
        tbStoragePath.Text = storagePath;
    }

然后新建一个WinFileManger

复制代码
class WinFileManage
  {

    //If needed, we can add more parameters for this function
    public static string OpenFolderAndGetPath(IWin32Window owner)
    {
      FolderBrowserDialogEx fbde = new FolderBrowserDialogEx();
      fbde.Title = "Please select the folder";
      fbde.RootFolder = Environment.SpecialFolder.MyComputer;
      fbde.SelectedPath = "";
      //fbde.StartPosition = FormStartPosition.CenterScreen;
      
      DialogResult dr = fbde.ShowDialog(owner);
      if (dr == DialogResult.OK)
        return fbde.SelectedPath;
      else
        return "";
    }


  }
复制代码

这里需要用到FolderBrowserDialogEx 这个WIN API 函数。

 

努力加载评论中...
点击右上角即可分享
微信分享提示