Тема: Отображение текущего каталога в окне выбора каталога
Недавно нашёл код как отобразить окно выбора каталога на языке C++.
Вот этот код:
#include <windows.h> #include <shlobj.h> #pragma comment(lib,"shell32") bool GetFolder (LPTSTR szPath) { szPath[0] = 0; bool result = false; LPMALLOC pMalloc; if (::SHGetMalloc(&pMalloc) == NOERROR) { BROWSEINFO bi; ::ZeroMemory(&bi,sizeof bi); bi.ulFlags = BIF_RETURNONLYFSDIRS; LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi); if (pidl != NULL) { if (::SHGetPathFromIDList(pidl,szPath)) result = true; pMalloc->Free(pidl); } pMalloc->Release(); } return result; }
Хотя наша функция и делает то, что нам нужно, но, скорее всего, вы найдёте её возможности слишком скромными. С другой стороны возможности функции ::SHBrowseForFolder позволяют добавить следующую функциональность:
- Установка дескриптора окна-владельца диалога.
- Добавление заголовка к диалогу.
- Отображение текущего каталога.
- Установка каталога по умолчанию.
- Установка корневого каталога.
Я не вижу причин не использовать эти возможности. Изменим нашу функцию.
#include <windows.h> #include <atlbase.h> #include <shlobj.h> #pragma comment(lib,"shell32") static int CALLBACK BrowseCallbackProc (HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { TCHAR szPath[_MAX_PATH]; switch (uMsg) { case BFFM_INITIALIZED: if (lpData) SendMessage(hWnd,BFFM_SETSELECTION,TRUE,lpData); break; case BFFM_SELCHANGED: SHGetPathFromIDList(LPITEMIDLIST(lParam),szPath); SendMessage(hWnd, BFFM_SETSTATUSTEXT, NULL, LPARAM(szPath)); break; } return 0; } BOOL GetFolder (LPCTSTR szTitle, LPTSTR szPath, LPCTSTR szRoot, HWND hWndOwner) { if (szPath == NULL) return false; bool result = false; LPMALLOC pMalloc; if (::SHGetMalloc(&pMalloc) == NOERROR) { BROWSEINFO bi; ::ZeroMemory(&bi,sizeof bi); bi.ulFlags = BIF_RETURNONLYFSDIRS; // дескриптор окна-владельца диалога bi.hwndOwner = hWndOwner; // добавление заголовка к диалогу bi.lpszTitle = szTitle; // отображение текущего каталога bi.lpfn = BrowseCallbackProc; bi.ulFlags |= BIF_STATUSTEXT; // установка каталога по умолчанию bi.lParam = LPARAM(szPath); // установка корневого каталога if (szRoot != NULL) { IShellFolder *pDF; if (SHGetDesktopFolder(&pDF) == NOERROR) { LPITEMIDLIST pIdl = NULL; ULONG chEaten; ULONG dwAttributes; USES_CONVERSION; LPOLESTR oleStr = T2OLE(szRoot); pDF->ParseDisplayName(NULL,NULL,oleStr,&chEaten,&pIdl,&dwAttributes); pDF->Release(); bi.pidlRoot = pIdl; } } LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi); if (pidl != NULL) { if (::SHGetPathFromIDList(pidl,szPath)) result = true; pMalloc->Free(pidl); } if (bi.pidlRoot != NULL) pMalloc->Free(bi.pidlRoot); pMalloc->Release(); } return result; }
Прототип нашей функции может выглядеть следующим образом:
BOOL GetFolder(LPCTSTR szTitle,LPTSTR szPath,LPCTSTR szRoot=NULL,HWND hWndOwner=NULL);
Уважаемые специалисты языка VisualBasic! Конвертируйте этот код на язык VisualBasic и для помощи Вам привожу ниже код который сам сейчас использую, но в этом коде нет возможности отображения текущего каталога. Поэтому очень Вас прошу добавьте код отображения текущего каталога в код VisualBasic основываясь на коде C++.
Вот код который я использую:
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 Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias _ "SHGetPathFromIDListA" (ByVal pidl As Long, _ ByVal pszPath As String) As Long Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias _ "SHBrowseForFolderA" (lpBrowseInfo As BrowseInfo) _ As Long Private Const BIF_RETURNONLYFSDIRS = &H1 Const MAX_PATH = 260 Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long) Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long Public Function GetFolder(szDialogTitle As String) As String Dim X As Long, bi As BrowseInfo, dwIList As Long Dim szPath As String, wPos As Integer With bi .lpszTitle = szDialogTitle .ulFlags = BIF_RETURNONLYFSDIRS + &H40 End With dwIList = SHBrowseForFolder(bi) szPath = Space$(512) X = SHGetPathFromIDList(ByVal dwIList, ByVal szPath) If X Then wPos = InStr(szPath, Chr(0)) GetFolder = Left$(szPath, wPos - 1) Else GetFolder = "" End If End Function
Очень Вас прошу, добавьте код отображения текущего каталога в код VisualBasic основываясь на коде C++.
С уважением Михаил.