zali 2006-12-25 09:48
VB中怎样打开目录窗口
用COMMEN DIALOG控件出来的对话框都是选择文件的,我希望能实现如附图所示的功能,打开一个目录窗口,选完后能将所选目录下的子目录和文件名罗列在一个列表框内以供选择,不知哪个高手能教教我,先谢谢了!
Nothing 2006-12-25 12:40
[code]
Public Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BROWSEINFO) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Private Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
'=======================================
'打开文件夹
'=======================================
Public Function GetDirName() As String
Dim bi As BROWSEINFO
Dim r As Long
Dim pidl As Long
Dim path As String
Dim pos As Integer
bi.pidlRoot = 0&
bi.lpszTitle = srtTitle
bi.ulFlags = 1
pidl = SHBrowseForFolder(bi)
path = Space$(512)
r = SHGetPathFromIDList(ByVal pidl&, ByVal path)
If r Then
pos = InStr(path, Chr$(0))
GetDirName = Left(path, pos - 1)
Else: GetDirName = ""
End If
End Function
[/code]
zali 2006-12-25 13:42
多谢老大的指点,得到目录后加一个文件列表框即可得到目录下的文件列表了,不过文件列表框周围总有一个黑色的边框,好像找不到可以去掉它的属性,真难看;如果想得到所选目录下的子目录列表可以办得到吗?还有一个小小的问题,弹出的选目录窗口怎么总是跑到屏幕左上角,有没办法让它默认在屏幕中间啊:)
Nothing 2006-12-25 21:26
估计你的算法要使用钩子了,在API中使用BrowseCallbackProc
你可以参考MSDN中关于BROWSEINFO。虽然都是小问题,可是在VB中,确实非常麻烦的问题。
zali 2006-12-26 09:04
太复杂了也弄不来:) ,文件列表框周围那一圈黑框能有办法弄掉吗?实在是感觉碍眼:(
Nothing 2006-12-26 10:32
我没有找到你说的那一圈黑框,如果有的话可能是系统问题。
这个API调用的是系统的文件夹对话框,调用的都是默认的,应当只与系统有关。
zali 2006-12-26 11:00
找不到哪里的问题,不过我换了一个方法:把文件框藏起来,多用了一个列表框,把文件框的内容加到列表框里,呵呵,土办法,别见笑!
Nothing 2006-12-26 15:02
呵呵,其实有时候一个办法搞不定之后,迂回一下,也是非常好的。
我就经常这样干。
zali 2006-12-27 11:23
今天又遇到一个奇怪的问题,如图示,090其实也是一个目录,是一个行业软件存档产生的,我尝试用Dir.list(i)将当前目录下的子目录罗列出来然后添加进一个列表框,单步执行的话,Dir.list(0)值为c:\autocam\090,但是Dir(dir.list(0),vbDirectory)的值却为空,Dir.list(1)值为c:\autocam\test,Dir(dir.list(1),vbDirectory)的值就没问题为test,这是什么原因呢?百思不得其解,向版主请教!
[[i] 本帖最后由 zali 于 2006-12-27 11:33 编辑 [/i]]
Nothing 2006-12-27 19:49
会不会是Dir控件的一个BUG??
你有没有打SP6补丁?
还有,Dir控件不要和Dir函数重名.
Nothing 2006-12-28 10:51
打完补丁后的版本是9782
下载地址:
[url]http://www.lihuasoft.net/download/show.php?id=25[/url]