能不能实现点击一个按钮实现打开一个指定的目录(如c:\test),就象在操作系统下面打开一个文件夹一样,显示下面的所有文件和子目录,是用windows 自带的api函数还是有这样的控件?

解决方案 »

  1.   

    --转自龙卷风的
    Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias _
            "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As LongPrivate Declare Function SHGetSpecialFolderLocation Lib _
            "shell32.dll" (ByVal hwndOwner As Long, ByVal nFolder _
            As Long, pIdl As ITEMIDLIST) As LongPrivate Declare Function SHGetFileInfo Lib "Shell32" Alias _
            "SHGetFileInfoA" (ByVal pszPath As Any, ByVal _
            dwFileAttributes As Long, psfi As SHFILEINFO, ByVal _
            cbFileInfo As Long, ByVal uFlags As Long) As LongPrivate Declare Function ShellAbout Lib "shell32.dll" Alias _
            "ShellAboutA" (ByVal hwnd As Long, ByVal szApp As _
            String, ByVal szOtherStuff As String, ByVal hIcon As Long) _
            As Long
    Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _
            Alias "SHGetPathFromIDListA" (ByVal pIdl As Long, ByVal _
            pszPath As String) As Long
    Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long)Const MAX_PATH = 260Private Type SHITEMID
        cb As Long
        abID() As Byte
    End TypePrivate Type ITEMIDLIST
        mkid As SHITEMID
    End TypePrivate 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 TypePrivate Type SHFILEINFO
        hIcon As Long
        iIcon As Long
        dwAttributes As Long
        szDisplayName As String * MAX_PATH
        szTypeName As String * 80
    End Type
    Private Function GetFolderValue(wIdx As Integer) As Long
        If wIdx < 2 Then
            GetFolderValue = 0
        ElseIf wIdx < 12 Then
            GetFolderValue = wIdx
        Else
            GetFolderValue = wIdx + 4
        End If
    End FunctionPrivate Sub Command1_Click()
      Dim BI As BROWSEINFO
      Dim nFolder As Long
      Dim IDL As ITEMIDLIST
      Dim pIdl As Long
      Dim sPath As String
      Dim SHFI As SHFILEINFO
      Dim m_wCurOptIdx As Integer
      Dim txtPath As String
      Dim txtDisplayName As String
      
      With BI
        .hOwner = Me.hwnd
        nFolder = GetFolderValue(m_wCurOptIdx)
        
        If SHGetSpecialFolderLocation(ByVal Me.hwnd, ByVal nFolder, IDL) = NOERROR Then
          .pidlRoot = IDL.mkid.cb
        End If
        
        .pszDisplayName = String$(MAX_PATH, 0)
        .lpszTitle = "Browsing is limited to: "
        .ulFlags = 0
      End With
      
      txtPath = ""
      txtDisplayName = ""
      
      pIdl = SHBrowseForFolder(BI)
      
      If pIdl = 0 Then Exit Sub
      sPath = String$(MAX_PATH, 0)
      SHGetPathFromIDList ByVal pIdl, ByVal sPath  txtPath = Left(sPath, InStr(sPath, vbNullChar) - 1)
      txtDisplayName = Left$(BI.pszDisplayName, _
                        InStr(BI.pszDisplayName, vbNullChar) - 1)
      
      SHGetFileInfo ByVal pIdl, 0&, SHFI, Len(SHFI), _
                    SHGFI_PIDL Or SHGFI_ICON Or SHGFI_SMALLICON
      
      SHGetFileInfo ByVal pIdl, 0&, SHFI, Len(SHFI), _
                    SHGFI_PIDL Or SHGFI_ICON
      CoTaskMemFree pIdl
      MsgBox "你选择的文件夹是" + Chr(13) + Chr(10) + txtPath
    End Sub
      

  2.   

    就是通过点击一个按钮打开windows里面的某个目录,文件夹的显示跟windows里面的一样,可以对里面的文件和目录进行操作!
      

  3.   

    To:frankwong,你提供的只能看到目录,无法看到目录里面的文件夹,还有,如何直接转到自己定义的目录里面呢,比如c:\windows\tmp\这个目录呢?
      

  4.   

    这个你不只要放一个按钮控件,还要在另一个窗体上放ListView控件,这个控件可以实现你说的显示效果,但是要显示具体什么目录还要自己写代码
      

  5.   

    我的目的并不是在我的程序里面显示,我需要打开一个跟windows里面一样的文件夹,因为我打开这个文件夹后还要对这个文件夹进行操作,比如删除和增加文件,所以listview是不可能做到的
      

  6.   

    樓主是這個意思吧:Shell "explorer C:\test"
      

  7.   

    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    Private Sub Command1_Click()
    ShellExecute Me.hWnd, vbNullString, "c:\test", vbNullString, vbNullString, 1
    End Sub