使用 Tree Control 进行目录和网络浏览






4.92/5 (35投票s)
2000年9月6日

294248

9031
一篇解释如何使用 TreeCtrl 浏览我的计算机和网络的文章
引言
此对话框类显示一个类似于“在文件中查找”浏览按钮中的目录树,如上图所示。
我注意到一些应用程序需要用户选择一个路径,通常使用CFileDialog
,但这并不适合这项任务。一个更好的选择是使用树形控件,但我没有找到任何允许访问网络(除了通过映射驱动器)的控件。这两种方法都缺乏“在文件中查找”所提供的风格。我还花了一些时间尝试使用SHBrowseForFolder
,但到目前为止还没有什么成功。
为什么不直接使用 SHBrowseForFolder?
虽然SHBrowseForFolder
提供了所有这些功能以及更多功能,但它也存在以下缺点
- 文档难以理解,缺乏好的例子。
- 语法非常晦涩难懂。
- 需要许多代码行加上回调才能执行简单的任务,例如设置初始路径。
SHBrowseForFolder
对话框不能进行很大程度的定制。例如,更改对话框的布局或添加一个显示有关所选目录信息的控件是不可能的。
如何使用它
我已将此代码开发成一个对话框,以便于实现。源代码的编写方式是将对话框对象放入一个类中,以便可以将其提取出来并在任何愿意的开发人员的代码中使用。要使用
- 将源文件DlgGetPath.cpp和DlgGetPath.h复制到您的项目目录并将它们添加到您的项目中。
- 从您的项目中,打开TryNetworkTree.rc文件并将位图(
IDB_FILE_TYPES
)和对话框(IDD_GET_PATH
)拖到您的项目中。 - 添加mpr.lib库,以便链接到您的应用程序中。为此,选择“Project->Settings”打开项目设置对话框。选择“Link”选项卡,然后从下拉框中选择“General”类别。在“Object/Link modules”编辑框中,键入mpr.lib。
- 在您想要激活选择器对话框的地方添加以下代码,例如在按钮处理程序中。
#include "DlgGetPath.h" //Definition to get path
...
void CBlarOnButtonBrowse()
{
CDlgGetPath dlgPath( this );
dlgPath.SetPath( _T("C:\\Temp") );
if( dlgPath.DoModal() == IDOK )
{
//Do some cool stuff with it here
//SetDlgItemText( IDC_EDIT_SEARCH_IN, dlgPath.GetPath() );
}
}
使用选择事件
当用户选择树中的一个分支时,可以捕获此事件并使用所选路径来执行某些操作。例如,Windows 资源管理器使用左侧窗格中分支的选择来显示右侧窗格中的目录。为此,请将代码放置在CDlgGetPath::OnSelchangedTree
的末尾,大约在第 391 行。路径可用,并在此示例的对话框顶部显示。
//
//TODO add code here to process users selection
//
ASSERT( GetDlgItem( IDC_STATIC_NOTE ) );
SetDlgItemText( IDC_STATIC_NOTE, sPath );
增强功能
- 正确显示回收站。
- 显示没有 S 编号的回收站内容。
- 添加项目时排序,但“整个网络”除外。
- 检查更复杂的网络。
- 确定为什么激活时图标从 ALT-TAB 栏中消失?
- 处理超过 16384 字节数据的
WNetEnumResource
。 - 使用
SHGetFileInfo
读取系统图标并使用它们会很好。
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。