http://bugs.winehq.org/show_bug.cgi?id=2339
------- Additional Comments From jonathan@ernstfamily.ch 2004-25-07 02:42 ------- Here is the answer from the author; I splitted his answer in two part and put the other part in bug 2338.
To see the original answer with correct indentation, please read here: http://forum.digital-digest.com/showthread.php?s=&postid=183082#post1830...
-------------------- I attached some code snippets, if you need more information, feel free to contact me directly: dvdshrink "at" dvdshrink.info
The browse for folder dialog uses some kind of callback, I forget for what purpose exactly, but I attached the code also.
/ ************************************************** *************************** SelectFolderDlg ************************************************** ***************************/
#ifndef BIF_NEWDIALOGSTYLE #define BIF_NEWDIALOGSTYLE 0x0040 #endif
#ifndef BIF_USENEWUI #define BIF_USENEWUI 0x0050 #endif
// browser callback: when initialized, set the initial selection // to the specified buffer
int CALLBACK _SHBrowseForFolderCallbackProc( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { if (uMsg == BFFM_INITIALIZED) { LPCTSTR szpath = (LPCTSTR) lpData;
if (szpath) { if (_tcslen(szpath)) { SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData); } } }
return 0; }
bool SelectFolderDlg(HWND hwnd, LPCTSTR sztitle, CString& szfolder, bool bAllowNew) { // get malloc interface for piddles
IMalloc * pmalloc = NULL;
if (FAILED(SHGetMalloc(&pmalloc))) return false; // get root folder
LPITEMIDLIST pidl = NULL; SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl);
// do browse
TCHAR szpath[MAX_PATH] = {0};
BROWSEINFO sInfo = {0}; sInfo.lpszTitle = sztitle; sInfo.pidlRoot = pidl; sInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_VALIDATE; sInfo.lpfn = _SHBrowseForFolderCallbackProc; sInfo.hwndOwner = hwnd; sInfo.lParam = (LPARAM)(LPCTSTR)(szfolder);
if (bAllowNew) sInfo.ulFlags |= BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_USENEWUI; LPITEMIDLIST pid2; pid2 = SHBrowseForFolder(&sInfo);
pmalloc->Free(pidl);
// if we have a folder
bool bok = false;
if (pid2) { if (SUCCEEDED(SHGetPathFromIDList(pid2, szpath))) { bok = true; szfolder = szpath; } pmalloc->Free(pid2); }
// free piddles
pmalloc->Release();
// ok!
return bok; }