VB自带的标准对话框控件好像不能同时选择文件夹和文件(只能返回文件,而文件夹被忽略),有没有类似这样的控件呢?

解决方案 »

  1.   

    SHBrowseForFolder BIF_BROWSEINCLUDEFILES Private Type BrowseInfo 
       hWndOwner As Long 
       pIDLRoot As Long 
       pszDisplayName As String 
       lpszTitle As String 
       ulFlags As Long 
       lpfnCallback As Long 
       lParam As Long 
       iImage As Long 
    End Type Public Const BIF_RETURNONLYFSDIRS = &H1 
    Public Const BIF_DONTGOBELOWDOMAIN = &H2 
    Public Const BIF_STATUSTEXT = &H4 
    Public Const BIF_RETURNFSANCESTORS = &H8 
    Public Const BIF_EDITBOX = &H10 
    Public Const BIF_VALIDATE = &H20 
    Public Const BIF_NEWDIALOGSTYLE = &H40 
    Public Const BIF_USENEWUI = (BIF_NEWDIALOGSTYLE Or BIF_EDITBOX) 
    Public Const BIF_BROWSEINCLUDEURLS = &H80 
    Public Const BIF_UAHINT = &H100 
    Public Const BIF_NONEWFOLDERBUTTON = &H200 
    Public Const BIF_NOTRANSLATETARGETS = &H400 
    Public Const BIF_BROWSEFORCOMPUTER = &H1000 
    Public Const BIF_BROWSEFORPRINTER = &H2000 
    Public Const BIF_BROWSEINCLUDEFILES = &H4000 
    Public Const BIF_SHAREABLE = &H8000 
    Private 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) Public Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long 
    Public Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" (lpBrowseInfo As BrowseInfo) As Long 
    Public Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long) 
    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 mstrSTARTFOLDER As String 
    Public Function GetFolder(ByVal hWndModal As Long, Optional StartFolder As String = "", Optional Title As String = "Please select a folder:", _ 
       Optional IncludeFiles As Boolean = False, Optional IncludeNewFolderButton As Boolean = False) As String 
        Dim bInf As BrowseInfo 
        Dim RetVal As Long 
        Dim PathID As Long 
        Dim RetPath As String 
        Dim Offset As Integer 
        'Set the properties of the folder dialog 
        bInf.hWndOwner = hWndModal 
        bInf.pIDLRoot = 0 
        bInf.lpszTitle = Title 
        bInf.ulFlags = BIF_RETURNONLYFSDIRS Or BIF_STATUSTEXT 
        If IncludeFiles Then bInf.ulFlags = bInf.ulFlags Or BIF_BROWSEINCLUDEFILES 
        If IncludeNewFolderButton Then bInf.ulFlags = bInf.ulFlags Or BIF_NEWDIALOGSTYLE 
        If StartFolder <> "" Then 
           mstrSTARTFOLDER = StartFolder & vbNullChar 
           bInf.lpfnCallback = GetAddressofFunction(AddressOf BrowseCallbackProc) 'get address of function. 
       End If 
        'Show the Browse For Folder dialog 
        PathID = SHBrowseForFolder(bInf) 
        RetPath = Space$(512) 
        RetVal = SHGetPathFromIDList(ByVal PathID, ByVal RetPath) 
        If RetVal Then 
             'Trim off the null chars ending the path 
             'and display the returned folder 
             Offset = InStr(RetPath, Chr$(0)) 
             GetFolder = Left$(RetPath, Offset - 1) 
             'Free memory allocated for PIDL 
             CoTaskMemFree PathID 
        Else 
             GetFolder = "" 
        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 
       On Error Resume Next 
       Dim lpIDList As Long 
       Dim ret As Long 
       Dim sBuffer As String 
       Select Case uMsg 
           Case BFFM_INITIALIZED 
               Call SendMessage(hWnd, BFFM_SETSELECTION, 1, mstrSTARTFOLDER) 
           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 
    Private Function GetAddressofFunction(add As Long) As Long 
     GetAddressofFunction = add 
    End Function 
      

  2.   

    同意jiangsheng(蒋晟.Net[MVP]) 当使用BIF_BROWSEINCLUDEFILES风格时,SHBrowseForFolder允许选择目录
      

  3.   

    //当使用BIF_BROWSEINCLUDEFILES风格时,SHBrowseForFolder允许选择目录呵呵,应该说:
    使用BIF_BROWSEINCLUDEFILES风格时,SHBrowseForFolder允许选择文件,SHBrowseForFolder本来就是选择目录的
      

  4.   

    另外一种方法:
    http://visualbasicforum.com/printthread.php?t=46034
      

  5.   

    //谢谢,可是使用这种办法好像不能复选啊,我的本意是能同时选择文件和目录。一、自己编写个目录树控件来实现选择。虽然编码量较大但技术难度不高
    二、可以用通用对话框选择文件夹,只不过得写回调函数来扩展通用对话框的功能,而且牵涉到PIDL等Shell API概念。虽然代码较少,但技术难度很高上面rainstormmaster(暴风雨 v2.0)贴的那地址就用的是方法二
    http://visualbasicforum.com/printthread.php?t=46034
      

  6.   

    不知怎么回事,http://visualbasicforum.com/printthread.php?t=46034中介绍的GetOpenFileName函数好像不起作用,没有对话框弹出。