怎样用TreeView和ListView造出windows资源管理器的样子

2024-11-29 22:57:48
推荐回答(1个)
回答1:

我首先想告诉你的是,下面的代码仅仅给出一层关系。如果要实现子目录的功能,你需要按照这个方法做递归运算。不过,建议你递归只要一层,即只寻找该目录下是否有子目录,并只增加这一层子目录的节点,而如果用户在这一层节点上点击时,你再做一次搜索来增加节点。这种做法在子目录嵌套很深的时候是非常有用的,你不用等很久来形成你的目录树。

下面的例子主要是演示了如何使用FINDFIRSTFILE等API函数来查找整个磁盘上的目录和文件。如果在DELPHI中,实现是会更简单一点,而在VB里,我不得不增加一个模块来放置了许多API的声明,甚至我没有使用的。我想你从这些代码里得到做这个的方法。所有我这段代码里可以完成工作包括:
形成你C盘的第一层目录树,当你在一个目录上点击时,将在LISTVIEW中列出该目录下的文件。
没有完成的功能包括:不包括子目录,未有LISTVIEW的几种查看方式,和IMAGELIST的配合图标。这里我想你应该学习如何从文件中得到图标,然后把这个图标加入到一个IMAGELIST中,并把它赋给你的LISTVIEW的某个条目。提示使用API函数ExtractICONEX(好象是这个名字)
还有有关根据屏幕大小来调整TREEVIEW和LISTVIEW,我想有了方法,做这些应该对你很容易。
另外提一句,WINDOWS的资源管理器实现文件搜索并不是这几个函数,而是使用的ISHELL接口,这在DELPHI里比较好做,在VB里如何实现对我也是个问题,所以以下的代码仅算是给你的参考吧!

'----------------------------
'FORM1的代码
'----------------------------

Private Sub Form_Load()
Dim search As WIN32_FIND_DATA
Dim ret As Long
ret = FindFirstFile("C:\*.*", search)
TreeView1.Nodes.Clear

' 设置TREEVIEW的线属性
TreeView1.LineStyle = tvwRootLines

' 增加节点对象
Dim nodX As Node ' 声明一个节点变量
' 第一个节点为C盘,当然可以加入更多的盘,可以用GETDRIVETYPE来检测
Set nodX = TreeView1.Nodes.Add(, , "Root", "C:\")
Dim i As Long
Dim j As Long
j = 0
i = 1
Do While i <> 0
If (search.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
'检测搜索到的文件属性是否是目录
j = j + 1
Set nodX = TreeView1.Nodes.Add("Root", tvwChild, "Child" + Str(j), Trim(search.cFileName))
End If
i = FindNextFile(ret, search)
Loop
nodX.EnsureVisible
loaditem ListView1, "C:"
End Sub

Private Sub TreeView1_Click()
Dim NowNode As Node
Set NowNode = TreeView1.SelectedItem
If NowNode.Text <> "" Then
loaditem ListView1, NowNode.Parent.Text + NowNode.Text
End If
End Sub

'---------------------------
'模块一的代码
'----------------------------
Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Public Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Public Const MAX_PATH = 260
Public Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

Public Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type

Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10

Public Sub loaditem(List As ListView, path As String)
Dim search As WIN32_FIND_DATA
Dim ret As Long
Dim FindKey As String
FindKey = path + "\*.*"
ret = FindFirstFile(FindKey, search)

Dim Nowitem As ListItem ' 声明LISTVIEW的条目变量.
Dim i As Long
Dim j As Long
j = 0
If ret <> 0 Then
i = 1
Else
i = 0
End If
List.View = lvwList
List.ListItems.Clear
Do While i <> 0
If (search.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) <> FILE_ATTRIBUTE_DIRECTORY Then
j = j + 1
Set Nowitem = List.ListItems.Add(j, , Trim(search.cFileName))
End If
i = FindNextFile(ret, search)
Loop

End Sub

'-----------------------------------------------------------------
'最后说明一点,只要在窗口上放置一个TREEVIEW和LISTVIEW即可运行本代码\

------Solutions------