65.9K
CodeProject 正在变化。 阅读更多。
Home

一个“Explorer 风格”的 TreeView 控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.62/5 (37投票s)

2006 年 2 月 17 日

2分钟阅读

viewsIcon

341318

downloadIcon

15796

一篇文章,描述如何创建一个带有系统图标的类似于资源管理器的TreeView。

ExplorerTreeView Demo

引言

这是一个简单的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);

历史

目前还没有。

© . All rights reserved.