快速开车组合框

& lt; o> Screenshot - DriveComboBox.jpg 介绍 最近,我需要一些方法来显示计算机上的逻辑驱动器和只有逻辑驱动器。我不认为使用OpenFileDialog或FolderBrowserDialog会有什么问题,但我很快意识到它们并没有完成我想要它们做的事情。 因此,我求助于CodeProject,看看这里是否存在一个可以完成这项工作的控件。我找到了几个(一个“Explorer-Style”的TreeView控件,DriveComboBox, Drive Box),但没有一个能让我满意地解决我的问题,因此我选择了黑我自己的控件。 使用的代码 要使用该控件,请包含代码并将标准组合框添加到窗体/对话框/控件中。接下来,将控件的类型更改为“System.Windows.Forms”。组合框”到“ZinoLib.Windows.Controls.DriveComboBox”。 隐藏,复制Code

...
private ZinoLib.Windows.Controls.DriveComboBox _cbDrives = 
        new ZinoLib.Windows.Controls.DriveComboBox();
...

如果您不想使用设计器将组合框添加到父控件,下面的代码描述了如何创建和添加DriveComboBox到父控件: 隐藏,复制Code

public class Form1 : System.Windows.Forms.Form
{
   private ZinoLib.Windows.Controls.DriveComboBox _cbDrives;

   ...

   private void CreateDriveComboBox()
   {
      _cbDrives = new ZinoLib.Windows.Controls.DriveComboBox();
      _cbDrives.Location = new System.Drawing.Point(8, 24);
      _cbDrives.Name = "_cbDrives";
      _cbDrives.Size = new System.Drawing.Size(320, 21);
      _cbDrives.TabIndex = 0;
      this.Controls.Add(this._cbDrives);
   }

   ...

}

本文中的代码同时支持。net framework 1.1和。net framework 2.0。 的兴趣点 . net框架内置了通过调用System.IO.Directory.GetLogicalDrives()来检索逻辑驱动器字母的支持——但是,它没有提供检索卷名或适当图标的接口。通过浏览MrPJ的“Explorer-Style”TreeView控件的源代码和微软319350,我知道了如何通过使用位于shell32.dll的SHGetFileInfo来检索这些信息。通过解析适当的标志,SHGetFileInfo可以返回显示名称、图标索引、图标句柄等等。然后,我需要一种方法来显示这些信息——并认为扩展Niels Penneman出色的ImageCombo控制很容易。10分钟后,DriveComboBox就完成了,可以使用了。 驱动器信息的检索是在函数“BuildDriveList()”中完成的,该函数最初由DriveComboBox的构造函数调用。在SHGetFileInfo用于检索实际的驱动器信息之前,我们必须说明需要哪些信息。对于DriveComboBox,需要提供以下信息: iconIcon indexDisplay名称 实际的检索非常简单,因为我们只需要遍历system . io . direct . getlogicaldrives()返回的驱动器,并为每个驱动器调用SHGetFileInfo。然后,可以使用检索到的信息构建驱动器图标的ImageList,并将它们添加到组合框中。 隐藏,收缩,复制Code

public void BuildDriveList()
{
   base.Items.Clear();

   ShellAPI.SHFILEINFO shInfo = new ShellAPI.SHFILEINFO();
   ShellAPI.SHGFI dwAttribs = 
     ShellAPI.SHGFI.SHGFI_ICON |
     ShellAPI.SHGFI.SHGFI_SMALLICON |
     ShellAPI.SHGFI.SHGFI_SYSICONINDEX |
     ShellAPI.SHGFI.SHGFI_DISPLAYNAME;

   ListDictionary _iconDict = new ListDictionary();            
   foreach( string drive in System.IO.Directory.GetLogicalDrives() )
   {
      IntPtr m_pHandle = ShellAPI.SHGetFileInfo(drive, 
                            ShellAPI.FILE_ATTRIBUTE_NORMAL,
                            ref shInfo,
                            (uint)System.Runtime.InteropServices.Marshal.SizeOf(shInfo),
                            dwAttribs);

      if( m_pHandle.Equals(IntPtr.Zero)==false )                    
      {
         int idxIcon = 0;
         if( _iconDict.Contains(shInfo.iIcon)==false )
         {
            base.ImageList.Images.Add( 
              System.Drawing.Icon.FromHandle(shInfo.hIcon).Clone() 
              as System.Drawing.Icon );

            User32API.DestroyIcon(shInfo.hIcon);

            _iconDict.Add( shInfo.iIcon, _iconDict.Count );
            idxIcon = _iconDict.Count-1;
         }
         else
            idxIcon = Convert.ToInt32( _iconDict[shInfo.iIcon] );


         ImageComboItem item = 
           new ImageComboItem(shInfo.szDisplayName, idxIcon, false);
         item.ItemValue = drive;
         base.Items.Add( item );
      }
   }

   if( base.Items.Count!=0 )
      base.SelectedIndex = 0;
}

许可证 你可以自由地以任何你希望的方式使用这段代码-在免费软件和商业程序-免费。如果你能在“关于你的信息”框里放个小链接,那就太好了,但这不是必须的。 确认 大部分的功劳必须归功于Niels Penneman的ImageCombo控件,它在DriveComboBox控件中做了大部分的魔法,MrPJ为他的“Explorer-Style”TreeView控件,这给了我使用SHGetFileInfo的想法。 历史 2007-05-08:最初版本。2007-05-15:将驱动器枚举移动到单独的函数“BuildDriveList”并从设计器中删除Items属性。2007-05-23:对文章文本的小修改。 本文转载于:http://www.diyabc.com/frontweb/news358.html

原文地址:https://www.cnblogs.com/Dincat/p/13443784.html