• Kategori

  • Common Dialog, Browse For Folder – called with API

    ‘Description: Calls the “Browse For Folder Dialog” without need for an OCX

    ‘Place the following code in under a command button or in a menu, etc…

    Dim BI As BROWSEINFO
    Dim nFolder As Long
    Dim IDL As ITEMIDLIST
    Dim pIdl As Long
    Dim sPath As String
    Dim SHFI As SHFILEINFO

    With BI
    ‘ The dialog’s owner window…
    .hOwner = Me.hWnd

    ‘ Set the Browse dialog root folder
    nFolder = GetFolderValue(m_wCurOptIdx)

    ‘ Fill the item id list with the pointer of the selected folder item, rtns 0 on success
    ‘ ==================================================
    ‘ If this function fails because the selected folder doesn’t exist,
    ‘ .pidlRoot will be uninitialized & will equal 0 (CSIDL_DESKTOP)
    ‘ and the root will be the Desktop.
    ‘ DO NOT specify the CSIDL_ constants for .pidlRoot !!!!
    ‘ The SHBrowseForFolder() call below will generate a fatal exception
    ‘ (GPF) if the folder indicated by the CSIDL_ constant does not exist!!
    ‘ ==================================================
    If SHGetSpecialFolderLocation(ByVal Me.hWnd, ByVal nFolder, IDL) = NOERROR Then
    .pidlRoot = IDL.mkid.cb
    End If

    ‘ Initialize the buffer that rtns the display name of the selected folder
    .pszDisplayName = String$(MAX_PATH, 0)

    ‘ Set the dialog’s banner text
    .lpszTitle = “Browsing is limited to: ” & optFolder(m_wCurOptIdx).Caption

    ‘ Set the type of folders to display & return
    ‘ -play with these option constants to see what can be returned
    .ulFlags = GetReturnType()

    End With

    ‘ Clear previous return vals before the
    ‘ dialog is shown (it might be cancelled)
    txtPath = “”
    txtDisplayName = “”
    pic16Icon.Picture = LoadPicture() ‘ clears prev icon
    pic32Icon.Picture = LoadPicture()

    ‘ Show the Browse dialog
    pIdl = SHBrowseForFolder(BI)

    ‘ If the dialog was cancelled…
    If pIdl = 0 Then Exit Sub

    ‘ Fill sPath w/ the selected path from the id list
    ‘ (will rtn False if the id list can’t be converted)
    sPath = String$(MAX_PATH, 0)
    SHGetPathFromIDList ByVal pIdl, ByVal sPath

    ‘ Display the path and the name of the selected folder
    txtPath = Left(sPath, InStr(sPath, vbNullChar) – 1)
    txtDisplayName = Left$(BI.pszDisplayName, _
    InStr(BI.pszDisplayName, vbNullChar) – 1)

    ‘ Get the 16×16 icon info from the id list using the pidl
    SHGetFileInfo ByVal pIdl, 0&, SHFI, Len(SHFI), _
    SHGFI_PIDL Or SHGFI_ICON Or SHGFI_SMALLICON
    ‘ The 16×16 icon handle rtnd in SHFI.hIcon is stretched to 32×32.
    ‘ DrawIconEx() will shrink (or stretch) the icon per it’s cxWidth & cyWidth params
    DrawIconEx pic16Icon.hdc, 0, 0, SHFI.hIcon, 16, 16, 0, 0, DI_NORMAL
    pic16Icon.Refresh

    ‘ Get the 32×32 icon info from the id list
    SHGetFileInfo ByVal pIdl, 0&, SHFI, Len(SHFI), _
    SHGFI_PIDL Or SHGFI_ICON
    ‘ SHFI.hIcon is OK here so DrawIcon() can be used
    DrawIcon pic32Icon.hdc, 0, 0, SHFI.hIcon
    pic32Icon.Refresh

    ‘ Frees the memory SHBrowseForFolder()
    ‘ allocated for the pointer to the item id list
    CoTaskMemFree pIdl

    ‘End of Code————————————————————————————

    ‘Module Declarations —————————————————————————

    ‘ Objects in the shell’s namespace are assigned item identifiers and item
    ‘ identifier lists. An item identifier uniquely identifies an item within its parent
    ‘ folder. An item identifier list uniquely identifies an item within the shell’s
    ‘ namespace by tracing a path to the item from the desktop.

    ‘ An item identifier is defined by the variable-length SHITEMID structure.
    ‘ The first two bytes of this structure specify its size, and the format of
    ‘ the remaining bytes depends on the parent folder, or more precisely
    ‘ on the software that implements the parent folder’s IShellFolder interface.
    ‘ Except for the first two bytes, item identifiers are not strictly defined, and
    ‘ applications should make no assumptions about their format.
    Type SHITEMID ‘ mkid
    cb As Long ‘ Size of the ID (including cb itself)
    abID() As Byte ‘ The item ID (variable length)
    End Type

    ‘ The ITEMIDLIST structure defines an element in an item identifier list
    ‘ (the only member of this structure is an SHITEMID structure). An item
    ‘ identifier list consists of one or more consecutive ITEMIDLIST structures
    ‘ packed on byte boundaries, followed by a 16-bit zero value. An application
    ‘ can walk a list of item identifiers by examining the size specified in each
    ‘ SHITEMID structure and stopping when it finds a size of zero. A pointer
    ‘ to an item identifier list, is sometimes called a PIDL (pronounced piddle)
    Type ITEMIDLIST ‘ idl
    mkid As SHITEMID
    End Type

    ‘ Converts an item identifier list to a file system path.
    ‘ Returns TRUE if successful or FALSE if an error occurs, for example,
    ‘ if the location specified by the pidl parameter is not part of the file system.
    Declare Function SHGetPathFromIDList Lib “shell32.dll” Alias “SHGetPathFromIDListA” _
    (ByVal pIdl As Long, ByVal pszPath As String) As Long

    ‘ Retrieves the location of a special (system) folder.
    ‘ Returns NOERROR if successful or an OLE-defined error result otherwise.
    Declare Function SHGetSpecialFolderLocation Lib “shell32.dll” _
    (ByVal hwndOwner As Long, ByVal nFolder As Long, _
    pIdl As ITEMIDLIST) As Long

    ‘ SHGetSpecialFolderLocation successful rtn val
    Public Const NOERROR = 0

    ‘ SHGetSpecialFolderLocation nFolder params:
    ‘ Most folder locations are stored in:
    ‘ [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders]
    ‘ Value specifying the types of folders to be listed in the dialog box as well as other
    ‘ options. This member can be 0 or one of the following values:

    ‘ Windows desktop, virtual folder at the root of the name space.
    Public Const CSIDL_DESKTOP = &H0

    ‘ File system directory that contains the user’s program groups
    ‘ (which are also file system directories).
    Public Const CSIDL_PROGRAMS = &H2

    ‘ Control Panel, virtual folder containing icons for the control panel applications.
    Public Const CSIDL_CONTROLS = &H3

    ‘ Printers folder, virtual folder containing installed printers.
    Public Const CSIDL_PRINTERS = &H4

    ‘ File system directory that serves as a common respository for documents.
    Public Const CSIDL_PERSONAL = &H5 ‘ (Documents folder)

    ‘ File system directory that contains the user’s favorite Internet Explorer URLs.
    Public Const CSIDL_FAVORITES = &H6

    ‘ File system directory that corresponds to the user’s Startup program group.
    Public Const CSIDL_STARTUP = &H7

    ‘ File system directory that contains the user’s most recently used documents.
    Public Const CSIDL_RECENT = &H8 ‘ (Recent folder)

    ‘ File system directory that contains Send To menu items.
    Public Const CSIDL_SENDTO = &H9

    ‘ Recycle bin, file system directory containing file objects in the user’s recycle bin.
    ‘ The location of this directory is not in the registry; it is marked with the hidden and
    ‘ system attributes to prevent the user from moving or deleting it.
    Public Const CSIDL_BITBUCKET = &HA

    ‘ File system directory containing Start menu items.
    Public Const CSIDL_STARTMENU = &HB

    ‘ File system directory used to physically store file objects on the desktop
    ‘ (not to be confused with the desktop folder itself).
    Public Const CSIDL_DESKTOPDIRECTORY = &H10

    ‘ My Computer, virtual folder containing everything on the local computer: storage
    ‘ devices, printers, and Control Panel. The folder may also contain mapped network drives.
    Public Const CSIDL_DRIVES = &H11

    ‘ Network Neighborhood, virtual folder representing the top level of the network hierarchy.
    Public Const CSIDL_NETWORK = &H12

    ‘ File system directory containing objects that appear in the network neighborhood.
    Public Const CSIDL_NETHOOD = &H13

    ‘ Virtual folder containing fonts.
    Public Const CSIDL_FONTS = &H14

    ‘ File system directory that serves as a common repository for document templates.
    Public Const CSIDL_TEMPLATES = &H15 ‘ (ShellNew folder)

    ‘========================================================

    ‘ Frees memory allocated by SHBrowseForFolder()
    Declare Sub CoTaskMemFree Lib “ole32.dll” (ByVal pv As Long)

    ‘ Displays a dialog box that enables the user to select a shell folder.
    ‘ Returns a pointer to an item identifier list that specifies the location
    ‘ of the selected folder relative to the root of the name space. If the user
    ‘ chooses the Cancel button in the dialog box, the return value is NULL.
    Declare Function SHBrowseForFolder Lib “shell32.dll” Alias “SHBrowseForFolderA” _
    (lpBrowseInfo As BROWSEINFO) As Long ‘ ITEMIDLIST

    ‘ Contains parameters for the the SHBrowseForFolder function and receives
    ‘ information about the folder selected by the user.
    Public Type BROWSEINFO ‘ bi

    ‘ Handle of the owner window for the dialog box.
    hOwner As Long

    ‘ Pointer to an item identifier list (an ITEMIDLIST structure) specifying the location
    ‘ of the “root” folder to browse from. Only the specified folder and its subfolders
    ‘ appear in the dialog box. This member can be NULL, and in that case, the
    ‘ name space root (the desktop folder) is used.
    pidlRoot As Long

    ‘ Pointer to a buffer that receives the display name of the folder selected by the
    ‘ user. The size of this buffer is assumed to be MAX_PATH bytes.
    pszDisplayName As String

    ‘ Pointer to a null-terminated string that is displayed above the tree view control
    ‘ in the dialog box. This string can be used to specify instructions to the user.
    lpszTitle As String

    ‘ Value specifying the types of folders to be listed in the dialog box as well as
    ‘ other options. This member can include zero or more of the following values below.
    ulFlags As Long

    ‘ Address an application-defined function that the dialog box calls when events
    ‘ occur. For more information, see the description of the BrowseCallbackProc
    ‘ function. This member can be NULL.
    lpfn As Long

    ‘ Application-defined value that the dialog box passes to the callback function
    ‘ (if one is specified).
    lParam As Long

    ‘ Variable that receives the image associated with the selected folder. The image
    ‘ is specified as an index to the system image list.
    iImage As Long

    End Type

    ‘ BROWSEINFO ulFlags values:
    ‘ Value specifying the types of folders to be listed in the dialog box as well as
    ‘ other options. This member can include zero or more of the following values:

    ‘ Only returns file system directories. If the user selects folders
    ‘ that are not part of the file system, the OK button is grayed.
    Public Const BIF_RETURNONLYFSDIRS = &H1

    ‘ Does not include network folders below the domain level in the tree view control.
    ‘ For starting the Find Computer
    Public Const BIF_DONTGOBELOWDOMAIN = &H2

    ‘ Includes a status area in the dialog box. The callback function can set
    ‘ the status text by sending messages to the dialog box.
    Public Const BIF_STATUSTEXT = &H4

    ‘ Only returns file system ancestors. If the user selects anything other
    ‘ than a file system ancestor, the OK button is grayed.
    Public Const BIF_RETURNFSANCESTORS = &H8

    ‘ Only returns computers. If the user selects anything other
    ‘ than a computer, the OK button is grayed.
    Public Const BIF_BROWSEFORCOMPUTER = &H1000

    ‘ Only returns (network) printers. If the user selects anything other
    ‘ than a printer, the OK button is grayed.
    Public Const BIF_BROWSEFORPRINTER = &H2000

    Declare Function DrawIcon Lib “user32″ (ByVal hdc As Long, _
    ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Boolean

    Declare Function DrawIconEx Lib “user32″ (ByVal hdc As Long, _
    ByVal xLeft As Long, ByVal yTop As Long, ByVal hIcon As Long, _
    ByVal cxWidth As Long, ByVal cyWidth As Long, ByVal istepIfAniCur As Long, _
    ByVal hbrFlickerFreeDraw As Long, ByVal diFlags As Long) As Boolean

    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 Long

    ‘ DrawIconEx() diFlags values:
    Public Const DI_MASK = &H1
    Public Const DI_IMAGE = &H2
    Public Const DI_NORMAL = &H3
    Public Const DI_COMPAT = &H4
    Public Const DI_DEFAULTSIZE = &H8

    ‘ pszPath:
    ‘ Pointer to a buffer that contains the path and filename. Both absolute and
    ‘ relative paths are valid. If uFlags includes the SHGFI_PIDL, value pszPath
    ‘ must be the address of an ITEMIDLIST structure that contains the list of
    ‘ item identifiers that uniquely identifies the file within the shell’s name
    ‘ space. This string can use either short (the 8.3 form) or long filenames.

    ‘ dwFileAttributes:
    ‘ Array of file attribute flags (FILE_ATTRIBUTE_ values). If uFlags does not
    ‘ include the SHGFI_USEFILEATTRIBUTES value, this parameter is ignored.

    Public Const FILE_ATTRIBUTE_READONLY = &H1
    Public Const FILE_ATTRIBUTE_HIDDEN = &H2
    Public Const FILE_ATTRIBUTE_SYSTEM = &H4
    Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
    Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
    Public Const FILE_ATTRIBUTE_NORMAL = &H80
    Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
    Public Const FILE_ATTRIBUTE_COMPRESSED = &H800

    ‘ psfi and cbFileInfo:
    ‘ Address and size, in bytes, of the SHFILEINFO structure that receives the
    ‘ file information.

    ‘ Maximun long filename path length
    Public Const MAX_PATH = 260

    Type SHFILEINFO ‘ shfi
    hIcon As Long
    iIcon As Long
    dwAttributes As Long
    szDisplayName As String * MAX_PATH
    szTypeName As String * 80
    End Type

    ‘ uFlags:
    ‘ Flag that specifies the file information to retrieve. This parameter can
    ‘ be a combination of the following values:

    ‘ Modifies SHGFI_ICON, causing the function to retrieve the file’s large icon.
    Public Const SHGFI_LARGEICON = &H0&

    ‘ Modifies SHGFI_ICON, causing the function to retrieve the file’s small icon.
    Public Const SHGFI_SMALLICON = &H1&

    ‘ Modifies SHGFI_ICON, causing the function to retrieve the file’s open icon.
    ‘ A container object displays an open icon to indicate that the container is open.
    Public Const SHGFI_OPENICON = &H2&

    ‘ Modifies SHGFI_ICON, causing the function to retrieve a shell-sized icon.
    ‘ If this flag is not specified, the function sizes the icon according to the
    ‘ system metric values.
    Public Const SHGFI_SHELLICONSIZE = &H4&

    ‘ Indicates that pszPath is the address of an ITEMIDLIST structure rather than a
    ‘ path name.
    Public Const SHGFI_PIDL = &H8&

    ‘ Indicates that the function should use the dwFileAttributes parameter.
    Public Const SHGFI_USEFILEATTRIBUTES = &H10&

    ‘ Retrieves the handle of the icon that represents the file and the index of the
    ‘ icon within the system image list. The handle is copied to the hIcon member
    ‘ of the structure specified by psfi, and the index is copied to the iIcon member.
    ‘ The return value is the handle of the system image list.
    Public Const SHGFI_ICON = &H100&

    ‘ Retrieves the display name for the file. The name is copied to the szDisplayName
    ‘ member of the structure specified by psfi. The returned display name uses the
    ‘ long filename, if any, rather than the 8.3 form of the filename.
    Public Const SHGFI_DISPLAYNAME = &H200&

    ‘ Retrieves the string that describes the file’s type. The string is copied to the
    ‘ szTypeName member of the structure specified by psfi.
    Public Const SHGFI_TYPENAME = &H400&

    ‘ Retrieves the file attribute flags. The flags are copied to the dwAttributes
    ‘ member of the structure specified by psfi.
    Public Const SHGFI_ATTRIBUTES = &H800&

    ‘ Retrieves the name of the file that contains the icon representing the file.
    ‘ The name is copied to the szDisplayName member of the structure specified by psfi.
    Public Const SHGFI_ICONLOCATION = &H1000&

    ‘ Returns the type of the executable file if pszPath identifies an executable file.
    ‘ To retrieve the executable file type, uFlags must specify only SHGFI_EXETYPE.
    ‘ The return value specifies the type of the executable file:
    ‘ 0 Nonexecutable file or an error condition.
    ‘ LOWORD = NE or PEHIWORD = 3.0, 3.5, or 4.0 Windows application
    ‘ LOWORD = MZHIWORD = 0 MS-DOS .EXE, .COM or .BAT file
    ‘ LOWORD = PEHIWORD = 0 Win32 console application
    Public Const SHGFI_EXETYPE = &H2000&

    ‘ Retrieves the index of the icon within the system image list. The index is copied
    ‘ to the iIcon member of the structure specified by psfi. The return value is the
    ‘ handle of the system image list.
    Public Const SHGFI_SYSICONINDEX = &H4000&

    ‘ Modifies SHGFI_ICON, causing the function to add the link overlay to the file’s icon.
    Public Const SHGFI_LINKOVERLAY = &H8000&

    ‘ Modifies SHGFI_ICON, causing the function to blend the file’s icon with the system
    ‘ highlight color.
    Public Const SHGFI_SELECTED = &H10000

    Leave a Reply