The standard dialog box for selecting a folder is called SHBrowseForFolder. Today I will show a simple wrapper function for it.
First the function header:
std::string GetFolder(HWND aHwndOwner, const std::string aTitle) {The function takes two arguments; a HWND for the owner window and a string to be displayed on the dialog box. The function returns the path selected as a std::string, a empty string if the user select Cancel on the dialog box.
We ned an char array, which will be filled with the path name, and a structure:
char temp[MAX_PATH]; BROWSEINFO BrowseInfo;Then we fill out the BrowseInfo structure:
BrowseInfo.hwndOwner = aHwndOwner; BrowseInfo.pidlRoot = 0; BrowseInfo.pszDisplayName = temp; BrowseInfo.lpszTitle = aTitle.c_str(); BrowseInfo.ulFlags = BIF_USENEWUI; BrowseInfo.lpfn = 0; BrowseInfo.lParam = 0; BrowseInfo.iImage = 0;If you compiler complains about the BIF_USENEWUI flag, you have to set ulFlags to 0 and you will get the old style box, which is not resizeable.
Then we call the dialogbox function:
ITEMIDLIST *ItemList = SHBrowseForFolder(&BrowseInfo);SHBrowseForFolder will return a NULL pointer if the user hits cancel, so we check:
if(ItemList) {Then we translate the ItemList into a normal path:
SHGetPathFromIDList(ItemList, temp);Now we are done, we just have to free the ItemList. To do so we have to get the allocater used by the shell, and use it to free:
LPMALLOC Malloc; SHGetMalloc(&Malloc); Malloc->Free(ItemList); Malloc->Release();And we are ready to return:
return std::string(temp); }If the user hits cancel we will return an empty string:
return std::string(""); }To use our function:
int main() { std::string Path = GetFolder(0, "Select install path"); MessageBox(0, Path.c_str(), "You selected:", MB_OK); return 0; }Here we use 0 as parent HWND, as this is a console app which does not have a window.
You have to include shlobj.h to use the SHxxx functions.
The code at a glance.