查看完整版本: VB中怎样打开目录窗口

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函数重名.

zali 2006-12-28 10:35

还有补丁啊?这个倒是不知道,我的版本如下:

Nothing 2006-12-28 10:51

打完补丁后的版本是9782

下载地址:
[url]http://www.lihuasoft.net/download/show.php?id=25[/url]

zali 2006-12-28 11:20

多谢指点!
页: [1]
查看完整版本: VB中怎样打开目录窗口