亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

c#用Treeview實現FolderBrowerDialog 和動態獲取系統圖標(運用了Win32 dll類庫)

2020-01-24 03:34:50
字體:
來源:轉載
供稿:網友

事情是這樣子的。我需要做一個下面的東東:

這個不難啊,然后就用FolderBrowerDialog這個神器,嗯 還不錯,剛開始客戶用了也很喜歡。

可是過了一段時間之后,客戶說 要屏蔽右鍵功能,他不想讓其他通過右鍵能打開或瀏覽文件夾,如下面 紅色要給屏蔽。

我一開始以為只是一個參數問題,就爽快的答應了客戶咯。可是啊后來找啊找 找到天荒地老也木有找到。。。放棄了,然后改用了TreeView。。結果,版本出來了,先截圖:

好吧,確實很丑哦。。

復制代碼 代碼如下:

public MyDirectory()
      {
          InitializeComponent();
          treeViewDirectory.BeginUpdate();
          label1.Text = folderTitle;
          treeViewDirectory.ImageList = imageList1;
          treeViewDirectory.SelectedImageIndex = 3;
          EnumDrivers();
          treeViewDirectory.EndUpdate();

          this.SetBounds((Screen.GetBounds(this).Width / 2) - (this.Width / 2), (Screen.GetBounds(this).Height / 2) - (this.Height / 2), this.Width, this.Height, BoundsSpecified.Location);
      }
      public static string folderTitle = "";
      private void EnumDrivers()
      {
          //treeViewDirectory.ImageIndex = 1;
          string[] allDriveNames = Directory.GetLogicalDrives();
          TreeNode rootNode = new TreeNode();
          rootNode.Text = "My Computer";
          rootNode.ImageIndex = 1;
          rootNode.Expand();
          treeViewDirectory.Nodes.Add(rootNode);
          treeViewDirectory.SelectedNode = rootNode.FirstNode;
          DriveInfo[] allDrives = DriveInfo.GetDrives();
          int j = 0;
          try
          {
              int i = 0;
              foreach (DriveInfo d in allDrives)
              {
                  TreeNode tn = new TreeNode(d.Name);

                  // GetIcon(d.Name, false)
                  this.imageList1.Images.Add(GetIcon(d.Name, false));

                  tn.ImageIndex = 2;

                  tn.Tag = d.RootDirectory.FullName;
                  treeViewDirectory.Nodes[0].Nodes.Add(tn);
                   treeViewDirectory.Nodes[0].Nodes[j].Text = d.Name ;
                  ShowDirs(tn);
                  j++;
              }
          }
          catch (System.Exception)
          {
          }
      }

      private void ShowDirs(TreeNode tn)
      {
          tn.Nodes.Clear();
          try
          {
              DirectoryInfo DirInfo = new DirectoryInfo(tn.Tag.ToString());
              if (!DirInfo.Exists)
              {
                  return;
              }
              else
              {
                  DirectoryInfo[] Dirs;
                  try
                  {
                      Dirs = DirInfo.GetDirectories();
                  }
                  catch (Exception e)
                  {
                      return;
                  }
                  foreach (DirectoryInfo Dir in Dirs)
                  {
                      TreeNode dir = new TreeNode(Dir.Name);
                      dir.ImageIndex = 0;
                      dir.Tag = Dir.FullName;
                      tn.Nodes.Add(dir);
                  }
              }
          }
          catch (System.Exception)
          { }
      }

      private void treeViewDirectory_BeforeExpand(object sender, TreeViewCancelEventArgs e)
      {
          treeViewDirectory.BeginUpdate();
          foreach (TreeNode tn in e.Node.Nodes)
          {
              ShowDirs(tn);
          }
          treeViewDirectory.EndUpdate();
      }

      public static string myValue { set; get; }
      private void btnOK_Click(object sender, EventArgs e)
      {
          MyDirectory.myValue = lastResult;
          this.Close();
      }

      private void btnCancel_Click(object sender, EventArgs e)
      {
          MyDirectory.myValue = null;
          this.Close();
      }
      private static string lastResult = null;
      private void treeViewDirectory_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
      {
          lastResult = null;
          string result = e.Node.FullPath;
          if (result != "My Computer")
          {
              if (result.Contains(@"My Computer/") || result.Contains("My Computer"))
              {
                  int len = 0;
                  if (result.Contains(@"My Computer/"))
                  {
                      len = @"My Computer/".Length;
                  }
                  else
                  {
                      len = "My Computer".Length;
                  }
                  result = result.Substring(len);
return result;
              }
          }
      }

雖然 這個時候,把右鍵點擊功能給取消啦,但是接著用戶提了三個要求:

1.需要系統自動匹配它的圖標

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

好吧,然后最后修改一下。這里面用到了 Win32 dll的幾個函數,確實很好用呢。。贊一個。。

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;

namespace HP.DMT.UI
{
    public partial class MyDirectory : Form
    {

        public MyDirectory()
        {
            InitializeComponent();
            treeViewDirectory.BeginUpdate();
            label1.Text = folderTitle;
            treeViewDirectory.ImageList = imageList1;
            treeViewDirectory.SelectedImageIndex = 3;
            EnumDrivers();
            treeViewDirectory.EndUpdate();

            this.SetBounds((Screen.GetBounds(this).Width / 2) - (this.Width / 2), (Screen.GetBounds(this).Height / 2) - (this.Height / 2), this.Width, this.Height, BoundsSpecified.Location);
        }
        public static string folderTitle = "";
        private void EnumDrivers()
        {
            //treeViewDirectory.ImageIndex = 1;
            string[] allDriveNames = Directory.GetLogicalDrives();
            TreeNode rootNode = new TreeNode();
            rootNode.Text = "My Computer";
            rootNode.ImageIndex = 1;
            rootNode.Expand();
            treeViewDirectory.Nodes.Add(rootNode);
            treeViewDirectory.SelectedNode = rootNode.FirstNode;
            DriveInfo[] allDrives = DriveInfo.GetDrives();
            int j = 0;
            try
            {
                int i = 0;
                foreach (DriveInfo d in allDrives)
                {
                    TreeNode tn = new TreeNode(d.Name);

                    // GetIcon(d.Name, false)
                    this.imageList1.Images.Add(GetIcon(d.Name, false));

                    tn.ImageIndex = 4 + i;
                    i++;
                    tn.Tag = d.RootDirectory.FullName;
                    treeViewDirectory.Nodes[0].Nodes.Add(tn);
                    if (d.DriveType.ToString() == "Fixed")
                    {
                        treeViewDirectory.Nodes[0].Nodes[j].Text = d.Name + "(" + d.DriveType.ToString() + "," + d.TotalFreeSpace / 1024 / 1024 / 1024 + "G/" + d.TotalSize / 1024 / 1024 / 1024 + "G)";
                    }
                    else
                    {
                        treeViewDirectory.Nodes[0].Nodes[j].Text = d.Name + "(" + d.DriveType.ToString() + ")";
                    }
                    ShowDirs(tn);
                    j++;
                }
            }
            catch (System.Exception)
            {
            }
        }

        private void ShowDirs(TreeNode tn)
        {
            tn.Nodes.Clear();
            try
            {
                DirectoryInfo DirInfo = new DirectoryInfo(tn.Tag.ToString());
                if (!DirInfo.Exists)
                {
                    return;
                }
                else
                {
                    DirectoryInfo[] Dirs;
                    try
                    {
                        Dirs = DirInfo.GetDirectories();
                    }
                    catch (Exception e)
                    {
                        return;
                    }
                    foreach (DirectoryInfo Dir in Dirs)
                    {
                        TreeNode dir = new TreeNode(Dir.Name);
                        dir.ImageIndex = 0;
                        dir.Tag = Dir.FullName;
                        tn.Nodes.Add(dir);
                    }
                }
            }
            catch (System.Exception)
            { }
        }

        private void treeViewDirectory_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            treeViewDirectory.BeginUpdate();
            foreach (TreeNode tn in e.Node.Nodes)
            {
                ShowDirs(tn);
            }
            treeViewDirectory.EndUpdate();
        }

        public static string myValue { set; get; }
        private void btnOK_Click(object sender, EventArgs e)
        {
            MyDirectory.myValue = lastResult;
            this.Close();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            MyDirectory.myValue = null;
            this.Close();
        }
        private static string lastResult = null;
        private void treeViewDirectory_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            lastResult = null;
            string result = e.Node.FullPath;
            if (result != "My Computer")
            {
                if (result.Contains(@"My Computer/") || result.Contains("My Computer"))
                {
                    int len = 0;
                    if (result.Contains(@"My Computer/"))
                    {
                        len = @"My Computer/".Length;
                    }
                    else
                    {
                        len = "My Computer".Length;
                    }
                    result = result.Substring(len);

                    char[] arrs = result.ToCharArray();
                    int beforLenth = result.Remove(result.IndexOf('/') + 1).Length;
                    int afterLenth = result.Substring(result.IndexOf('/') + 1).Remove(result.Substring(result.IndexOf('/') + 1).IndexOf(')')).Length;

                    char[] c = { ')' };
                    string str1 = result.Substring(0, 3);
                    string str2 = result.Substring(result.IndexOfAny(c, beforLenth + afterLenth, 1) + 1);

                    lastResult = str1 + str2;
                }
            }
        }

 
        [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;
        }
    }
}

結果如下:

核心代碼是:

復制代碼 代碼如下:

[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啦。

作者:Lanny☆蘭東才
出處:http://www.cnblogs.com/damonlan
Q Q:*********
E_mail:Damon_lan@163.com or Dongcai.lan@hp.com

本博文歡迎大家瀏覽和轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,在『參考』的文章中,我會表明參考的文章來源,尊重他人版權。若您發現我侵犯了您的版權,請及時與我聯系。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
九色精品美女在线| 午夜精品一区二区三区在线| 日韩中文字幕亚洲| 欧美国产日韩二区| 国产在线观看精品一区二区三区| 日韩国产一区三区| 亚洲全黄一级网站| 日韩成人中文字幕| 激情久久av一区av二区av三区| 久久99视频精品| 伊是香蕉大人久久| 亚洲香蕉伊综合在人在线视看| 久久久999精品视频| 国产亚洲精品va在线观看| 国产精品久久久久久久久借妻| 久久久久久免费精品| 亚洲男人天堂2024| 亚洲无av在线中文字幕| 国产裸体写真av一区二区| 美女性感视频久久久| 久99九色视频在线观看| 国产精品一二三在线| 欧美色视频日本高清在线观看| 国产精品欧美在线| 欧美成人在线影院| 欧美精品午夜视频| 欧美中文字幕视频在线观看| 欧美性猛交xxxx富婆| 中文字幕亚洲综合久久筱田步美| 亚洲人成啪啪网站| 97热在线精品视频在线观看| 亚洲欧美日韩久久久久久| 97在线观看视频国产| 欧美激情在线观看| 欧美日韩亚洲高清| 国产精品一区二区久久久| 欧美激情视频在线免费观看 欧美视频免费一| 97精品国产97久久久久久| 久久久久久久国产精品| 久久精品91久久久久久再现| 国产欧美va欧美va香蕉在| 日韩在线视频线视频免费网站| 国产91色在线免费| 国产精品视频一区二区三区四| 久久久精品欧美| 欧美夜福利tv在线| 91在线观看免费高清完整版在线观看| 日本精品中文字幕| 国产一区二区精品丝袜| 欧洲精品毛片网站| 国产精品久久久久影院日本| 亚洲一二三在线| 成人国产精品色哟哟| 伊人一区二区三区久久精品| 国产精品偷伦免费视频观看的| 国产精品视频xxx| 欧美理论片在线观看| 国产精品福利在线观看| 午夜精品蜜臀一区二区三区免费| 欧美一区二区三区精品电影| 欧美贵妇videos办公室| 亚洲精品中文字幕av| 欧美又大又粗又长| 成人网在线免费看| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产福利成人在线| 国产精品免费一区二区三区都可以| 亚洲精品456在线播放狼人| 精品久久久久久电影| 91久久精品一区| 久久久久久久一区二区三区| 91禁国产网站| 久久久久久久久久国产精品| 日韩网站在线观看| 欧美激情视频网| 欧美电影在线免费观看网站| 日韩在线观看免费| 一本色道久久88亚洲综合88| 精品久久久香蕉免费精品视频| 91视频88av| 国产久一一精品| 最近更新的2019中文字幕| 97超级碰在线看视频免费在线看| 91免费看片在线| 影音先锋欧美在线资源| 亚洲国产精品va在线看黑人动漫| 亚洲精品成人网| 亚洲影院色在线观看免费| 欧美成人免费网| 色av吧综合网| 欧美精品久久久久久久| 成人字幕网zmw| 亚洲xxx视频| 亚洲综合日韩在线| 91精品视频在线播放| 国产精自产拍久久久久久蜜| 国产精品第一区| 神马国产精品影院av| 精品视频在线观看日韩| 成人午夜一级二级三级| 中文字幕av日韩| 国产精品爽爽ⅴa在线观看| 亚洲人成欧美中文字幕| 日本国产精品视频| 久久视频国产精品免费视频在线| 久久久国产91| 亚洲天堂色网站| 欧美精品久久一区二区| 中文字幕日韩av| 国产福利视频一区二区| 国产精品美女av| 日韩a**中文字幕| 久久久亚洲欧洲日产国码aⅴ| 成人网中文字幕| 亚洲国产精品成人va在线观看| 亚洲一区av在线播放| 日韩欧美国产视频| 久久综合久久八八| 色老头一区二区三区在线观看| 久久99久久99精品免观看粉嫩| 亚洲美女精品成人在线视频| 日韩在线观看免费全集电视剧网站| 国产在线日韩在线| 国产精品久久9| 亚洲人免费视频| 亚洲国产精久久久久久| 欧美日韩加勒比精品一区| 欧美激情二区三区| 欧美电影院免费观看| 国产精品日韩精品| 疯狂做受xxxx高潮欧美日本| 亚洲影院高清在线| 欧美在线性视频| 欧美精品免费播放| 久久五月情影视| 久久免费观看视频| 久久久久久噜噜噜久久久精品| 国产ts人妖一区二区三区| 精品亚洲一区二区三区四区五区| 欧美尺度大的性做爰视频| 午夜精品久久17c| 热久久这里只有| 日韩视频亚洲视频| 欧美xxxx综合视频| 在线观看日韩av| 国产精品欧美一区二区三区奶水| 久久噜噜噜精品国产亚洲综合| 91a在线视频| 欧美多人爱爱视频网站| 国产美女被下药99| 亚洲成人精品久久| 欧美激情综合色| 在线性视频日韩欧美| 亚洲乱码一区av黑人高潮| 国产精品自产拍高潮在线观看| 欧美日韩第一视频| 日韩av手机在线| 57pao国产精品一区| 亚洲小视频在线观看| 国产精品都在这里| 欧美www在线| 欧美成人精品一区二区三区| 一本大道香蕉久在线播放29| 欧美又大又硬又粗bbbbb|