下载 source - 1 1.5 KB
& lt; o>
介绍 最近, 我需要一些方法来显示计算机上的逻辑驱动器和只有逻辑驱动器. 我不认为使用 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: 对文章文本的小修改. ://www.diyabc.com/frontweb/news358.html
来源: http://www.bubuko.com/infodetail-3654080.html