如何在浏览对话框中,既有选择文件夹的路径,又有新建文件夹的按钮?

解决方案 »

  1.   

    用CommonDialog   commonDialog.showopen这个控件不是有吗?
      

  2.   

    Debug.Print mBrowseForFolderAdv.BrowseForFolderAdv(bNewFolder:=True)======= 添加模块 mBrowseForFolderAdv.bas ==========
    '---------------------------------------------------------------------------------------
    ' Module    : mBrowseForFolderAdv
    ' DateTime  : 2006-10-21 17:12
    ' Author    : [email protected]
    ' Purpose   :
    ' Sample    :
    '    Dim sPath As String
    '    sPath = BrowseForFolderAdv(hwnd, "选择输出文件夹", cmbDst.Text, True)
    '    If Len(sPath) Then
    '        cmbDst.Text = sPath
    '    End If
    '  Stephen  Fonnesbeck
    '  [email protected]
    '  http://www.xmission.com/~steev
    '  Feb  20,  2000
    '
    Option Explicit
     
    Private Const BIF_STATUSTEXT = &H4&
    Private Const BIF_RETURNONLYFSDIRS = 1
    Private Const BIF_DONTGOBELOWDOMAIN = 2
    Private Const BIF_USENEWUI = &H40Private Const MAX_PATH = 260
     
    Private Const WM_USER = &H400
    Private Const BFFM_INITIALIZED = 1
    Private Const BFFM_SELCHANGED = 2
    Private Const BFFM_SETSTATUSTEXT = (WM_USER + 100)
    Private Const BFFM_SETSELECTION = (WM_USER + 102)
     
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
    Private 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
    Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
     
    Private Type BrowseInfo
       hWndOwner            As Long
       pIDLRoot              As Long
       pszDisplayName  As Long
       lpszTitle            As Long
       ulFlags                As Long
       lpfnCallback      As Long
       lParam                  As Long
       iImage                  As Long
    End Type
     
    Private m_CurrentDirectory   As String       'The  current  directory
    '
     
    Public Function BrowseForFolderAdv(Optional ByVal ownerhwnd As Long, _
        Optional ByVal Title As String, Optional ByVal StartDir As String, _
        Optional bNewFolder As Boolean) As String
       'Opens  a  Treeview  control  that  displays  the  directories  in  a  computer
     
       Dim lpIDList   As Long
       Dim szTitle   As String
       Dim sBuffer   As String
       Dim tBrowseInfo   As BrowseInfo
       m_CurrentDirectory = StartDir & vbNullChar
     
       szTitle = Title
       With tBrowseInfo
           .hWndOwner = ownerhwnd
           .lpszTitle = lstrcat(szTitle, "")
           .ulFlags = IIf(bNewFolder, &H40, _
               BIF_RETURNONLYFSDIRS) Or BIF_DONTGOBELOWDOMAIN Or BIF_STATUSTEXT
           .lpfnCallback = GetAddressofFunction(AddressOf BrowseCallbackProc)       'get  address  of  function.
       End With
     
       lpIDList = SHBrowseForFolder(tBrowseInfo)
       If (lpIDList) Then
           sBuffer = Space(MAX_PATH)
           SHGetPathFromIDList lpIDList, sBuffer
           sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
           BrowseForFolderAdv = sBuffer
       Else
           BrowseForFolderAdv = ""
       End If
         
    End Function
       
    Private Function BrowseCallbackProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal lp As Long, ByVal pData As Long) As Long
         
       Dim lpIDList   As Long
       Dim ret   As Long
       Dim sBuffer   As String
         
       On Error Resume Next       'Sugested  by  MS  to  prevent  an  error  from
                                                   'propagating  back  into  the  calling  process.
               
       Select Case uMsg
         
           Case BFFM_INITIALIZED
               Call SendMessage(hwnd, BFFM_SETSELECTION, 1, m_CurrentDirectory)
                 
           Case BFFM_SELCHANGED
               sBuffer = Space(MAX_PATH)
                 
               ret = SHGetPathFromIDList(lp, sBuffer)
               If ret = 1 Then
                   Call SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, sBuffer)
               End If
                 
       End Select
         
       BrowseCallbackProc = 0
         
    End Function
     
    '  This  function  allows  you  to  assign  a  function  pointer  to  a  vaiable.
    Private Function GetAddressofFunction(add As Long) As Long
       GetAddressofFunction = add
    End Function