一个“Explorer 风格”的 TreeView 控件






4.62/5 (37投票s)
2006 年 2 月 17 日
2分钟阅读

341318

15796
一篇文章,描述如何创建一个带有系统图标的类似于资源管理器的TreeView。
引言
这是一个简单的TreeView
派生控件,模仿了Windows资源管理器的界面。它没有提供除了标准的TreeView
控件方法、属性和事件之外的任何附加功能,但是它提供了一个ShellItem
类,可以用于扩展这个基本示例以满足您自己的需求,并且对于那些想要掌握系统图像列表和Shell32编程的人来说,也是一个良好的起点。
背景
最初,我开始研究这个主题是因为我想用C#开发一个FTP客户端,该客户端将实现一个类似于Windows资源管理器的本地系统资源管理器,但很快就意识到这并不是一件容易的事。感谢CodeProject和其他代码仓库,我找到了一些关于如何实现我想要的目标的好例子,但是最好的例子是用VB.NET或Delphi编写的,所以我决定基于我所发现的内容编写一个简单的C#控件。
代码的某些部分基于其他CodeProject教程和在互联网其他地方找到的代码示例。所有代码都是我自己编写的,但其中一些概念是“借鉴”的。
实用提示
对于TreeView
中的每个节点,都会创建一个关联的ShellItem对象并存储在节点的“Tag
”属性中。ShellItem
对象允许您检索由该节点表示的Shell文件夹的信息,例如该文件夹是否有任何子文件夹。例如,在TreeView
的“OnBeforeCollapse
”事件中,我们可以获取ShellItem
对象来执行一个简单的测试...
ShellItem shNodeItem = (ShellItem)e.Node.Tag;
if (shNodeItem.HasSubFolder)
// Do something...
我们还可以使用ShellItem
对象的ShellFolder
属性获取文件夹的IShellFolder
接口。使用这个接口,我们可以做各种各样巧妙的事情,例如实现Shell上下文菜单。
// Get the ShellItem for this node.
ShellItem shNodeItem = (ShellItem)e.Node.Tag;
// Create an array of PIDL's for obtaining
// the IContextMenu interface pointer.
IntPtr[] arrPidls = new IntPtr[0];
arrPidls[0] = shNodeItem.PIDL;
// Request the interface pointer.
uint uRetVal =
shNodeItem.ShellFolder.GetUIObjectOf(IntPtr.Zero,
1, arrPidls, ref IID_IContextMenu,
IntPtr.Zero, out pCtx);
if (uRetVal != 0)
Marshal.ThrowExceptionForHR((int)uRetVal);
...
Marshal.ReleaseComObject(pCtx);
历史
目前还没有。