/////////////////////////////////////////////////////////////////////////////// // BrowseCallbackProc - SHBrowseForFolder callback function static int CALLBACK BrowseCallbackProc(HWND hwnd, // Window handle to the browse dialog box UINT uMsg, // Value identifying the event LPARAM lParam, // Value dependent upon the message LPARAM lpData) // Application-defined value that was // specified in the lParam member of the // BROWSEINFO structure { switch (uMsg) { case BFFM_INITIALIZED: // sent when the browse dialog box has finished initializing. { // remove context help button from dialog caption LONG lStyle = ::GetWindowLong(hwnd, GWL_STYLE); lStyle &= ~DS_CONTEXTHELP; ::SetWindowLong(hwnd, GWL_STYLE, lStyle); lStyle = ::GetWindowLong(hwnd, GWL_EXSTYLE); lStyle &= ~WS_EX_CONTEXTHELP; ::SetWindowLong(hwnd, GWL_EXSTYLE, lStyle); // set initial directory ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData); // find the folder tree and make dialog larger HWND hwndTree = FindWindowEx(hwnd, NULL, _T("SysTreeView32"), NULL); if (hwndTree) { #if 0 // make the dialog larger CRect rectDlg; ::GetWindowRect(hwnd, &rectDlg); rectDlg.right += 40; rectDlg.bottom += 30; MoveWindowX(hwnd, rectDlg, TRUE); ::GetClientRect(hwnd, &rectDlg); // move the Cancel button CRect rectCancel(0, 0, 0, 0); HWND hwndCancel = ::GetDlgItem(hwnd, IDCANCEL); if (hwndCancel) ::GetWindowRect(hwndCancel, &rectCancel); ScreenToClientX(hwnd, &rectCancel); int h = rectCancel.Height(); int w = rectCancel.Width(); rectCancel.bottom = rectDlg.bottom - 5; rectCancel.top = rectCancel.bottom - h; rectCancel.right = rectDlg.right - 5; rectCancel.left = rectCancel.right - w; if (hwndCancel) MoveWindowX(hwndCancel, rectCancel, FALSE); // move the OK button CRect rectOK(0, 0, 0, 0); HWND hwndOK = ::GetDlgItem(hwnd, IDOK); if (hwndOK) ::GetWindowRect(hwndOK, &rectOK); ScreenToClientX(hwnd, &rectOK); rectOK.bottom = rectDlg.bottom - 5; rectOK.top = rectOK.bottom - h; rectOK.right = rectCancel.left - 10; rectOK.left = rectOK.right - w; if (hwndOK) MoveWindowX(hwndOK, rectOK, FALSE); // expand the folder tree to fill the dialog CRect rectTree; ::GetWindowRect(hwndTree, &rectTree); ScreenToClientX(hwnd, &rectTree); rectTree.top = 5; rectTree.left= 5; rectTree.bottom = rectOK.top - 5; rectTree.right = rectDlg.right - 5; MoveWindowX(hwndTree, rectTree, FALSE); #endif } else { // TRACE(_T("ERROR - tree control not found.\n")); _ASSERTE(hwndTree); } } break; case BFFM_SELCHANGED: // sent when the selection has changed { TCHAR szDir[MAX_PATH*2] = { 0 }; // fail if non-filesystem BOOL bRet = SHGetPathFromIDList((LPITEMIDLIST) lParam, szDir); if (bRet) { // fail if folder not accessible if (_taccess(szDir, 00) != 0) { bRet = FALSE; } else { SHFILEINFO sfi; ::SHGetFileInfo((LPCTSTR)lParam, 0, &sfi, sizeof(sfi), SHGFI_PIDL | SHGFI_ATTRIBUTES); // TRACE(_T("dwAttributes=0x%08X\n"), sfi.dwAttributes); // fail if pidl is a link if (sfi.dwAttributes & SFGAO_LINK) { // TRACE(_T("SFGAO_LINK\n")); bRet = FALSE; } } } // if invalid selection, disable the OK button if (!bRet) { ::EnableWindow(GetDlgItem(hwnd, IDOK), FALSE); } // TRACE(_T("szDir=%s\n"), szDir); } break; } return 0; }
/////////////////////////////////////////////////////////////////////////////// // SizeBrowseDialog - resize dialog, move controls static void SizeBrowseDialog(HWND hWnd, FOLDER_PROPS *fp) { TRACE(_T("in void SizeBrowseDialog\n")); // find the folder tree and make dialog larger HWND hwndTree = FindWindowEx(hWnd, NULL, _T("SysTreeView32"), NULL); if (!hwndTree) { // ... this usually means that BIF_NEWDIALOGSTYLE is enabled. // Then the class name is as used in the code below. hwndTree = FindWindowEx(hWnd, NULL, _T("SHBrowseForFolder ShellNameSpace Control"), NULL); TRACE(_T("SHBrowseForFolder ShellNameSpace Control: hwndTree=%X\n"), hwndTree); } CRect rectDlg; _ASSERTE(IsWindow(hwndTree)); if (hwndTree) { // check if edit box int nEditHeight = 0; HWND hwndEdit = FindWindowEx(hWnd, NULL, _T("Edit"), NULL); TRACE(_T("hwndEdit=%x\n"), hwndEdit); CRect rectEdit; if (hwndEdit && (fp->ulFlags & BIF_EDITBOX)) { ::GetWindowRect(hwndEdit, &rectEdit); ScreenToClientX(hWnd, &rectEdit); nEditHeight = rectEdit.Height(); } else if (hwndEdit) { ::MoveWindow(hwndEdit, 20000, 20000, 10, 10, FALSE); ::ShowWindow(hwndEdit, SW_HIDE); hwndEdit = 0; } // make the dialog larger ::GetWindowRect(hWnd, &rectDlg); rectDlg.right += 40; rectDlg.bottom += 30; if (hwndEdit) rectDlg.bottom += nEditHeight + 5; MoveWindowX(hWnd, rectDlg, TRUE); ::GetClientRect(hWnd, &rectDlg); int hMargin = 10; int vMargin = 10; // check if new dialog style - this means that there will be a resizing // grabber in lower right corner if (fp->ulFlags & BIF_NEWDIALOGSTYLE) hMargin = ::GetSystemMetrics(SM_CXVSCROLL); // move the Cancel button CRect rectCancel; HWND hwndCancel = ::GetDlgItem(hWnd, IDCANCEL); if (hwndCancel) ::GetWindowRect(hwndCancel, &rectCancel); ScreenToClientX(hWnd, &rectCancel); int h = rectCancel.Height(); int w = rectCancel.Width(); rectCancel.bottom = rectDlg.bottom - vMargin;//nMargin; rectCancel.top = rectCancel.bottom - h; rectCancel.right = rectDlg.right - hMargin; //(scrollWidth + 2*borderWidth); rectCancel.left = rectCancel.right - w; if (hwndCancel) { //TRACERECT(rectCancel); MoveWindowX(hwndCancel, rectCancel, FALSE); } // move the OK button CRect rectOK(0, 0, 0, 0); HWND hwndOK = ::GetDlgItem(hWnd, IDOK); if (hwndOK) ::GetWindowRect(hwndOK, &rectOK); ScreenToClientX(hWnd, &rectOK); rectOK.bottom = rectCancel.bottom; rectOK.top = rectCancel.top; rectOK.right = rectCancel.left - 10; rectOK.left = rectOK.right - w; if (hwndOK) { MoveWindowX(hwndOK, rectOK, FALSE); } // expand the folder tree to fill the dialog CRect rectTree; ::GetWindowRect(hwndTree, &rectTree); ScreenToClientX(hWnd, &rectTree); if (hwndEdit) { rectEdit.left = hMargin; rectEdit.right = rectDlg.right - hMargin; rectEdit.top = vMargin; rectEdit.bottom = rectEdit.top + nEditHeight; MoveWindowX(hwndEdit, rectEdit, FALSE); rectTree.top = rectEdit.bottom + 5; } else { rectTree.top = vMargin; } rectTree.left = hMargin; rectTree.bottom = rectOK.top - 10;//nMargin; rectTree.right = rectDlg.right - hMargin; //TRACERECT(rectTree); MoveWindowX(hwndTree, rectTree, FALSE); } else { TRACE(_T("ERROR - tree control not found.\n")); //_ASSERTE(hwndTree); } }