//============================================================================= // // DriveBox_GetDispInfo // LRESULT DriveBox_GetDispInfo(HWND hwnd,LPARAM lParam) { NMCOMBOBOXEX *lpnmcbe; LPDC_ITEMDATA lpdcid; SHFILEINFO shfi; WCHAR szTemp[256]; lpnmcbe = (LPVOID)lParam; lpdcid = (LPDC_ITEMDATA)lpnmcbe->ceItem.lParam; if (!lpdcid) return FALSE; // Get Display Name if (lpnmcbe->ceItem.mask & CBEIF_TEXT) IL_GetDisplayName(lpdcid->lpsf,lpdcid->pidl,SHGDN_NORMAL,lpnmcbe->ceItem.pszText,lpnmcbe->ceItem.cchTextMax); // Get Icon Index if (lpnmcbe->ceItem.mask & (CBEIF_IMAGE | CBEIF_SELECTEDIMAGE)) { IL_GetDisplayName(lpdcid->lpsf,lpdcid->pidl,SHGDN_FORPARSING,szTemp,256); SHGetFileInfo(szTemp,0,&shfi,sizeof(SHFILEINFO),SHGFI_SYSICONINDEX | SHGFI_SMALLICON); lpnmcbe->ceItem.iImage = shfi.iIcon; lpnmcbe->ceItem.iSelectedImage = shfi.iIcon; } // Set values lpnmcbe->ceItem.mask |= CBEIF_DI_SETITEM; return TRUE; }
//============================================================================= // // DriveBox_GetSelDrive // BOOL DriveBox_GetSelDrive(HWND hwnd,LPWSTR lpszDrive,int nDrive,BOOL fNoSlash) { COMBOBOXEXITEM cbei; LPDC_ITEMDATA lpdcid; int i = (int)SendMessage(hwnd,CB_GETCURSEL,0,0); // CB_ERR means no Selection if (i == CB_ERR) return FALSE; // Get DC_ITEMDATA* of selected Item cbei.mask = CBEIF_LPARAM; cbei.iItem = i; SendMessage(hwnd,CBEM_GETITEM,0,(LPARAM)&cbei); lpdcid = (LPDC_ITEMDATA)cbei.lParam; // Get File System Path for Drive IL_GetDisplayName(lpdcid->lpsf,lpdcid->pidl,SHGDN_FORPARSING,lpszDrive,nDrive); // Remove Backslash if required (makes Drive relative!!!) if (fNoSlash) PathRemoveBackslash(lpszDrive); return TRUE; }
// Must be called in response to a WM_NOTIFY/LVN_GETDISPINFO message from // the listview control BOOL DirList_GetDispInfo(HWND hwnd, LPARAM lParam, BOOL bNoFadeHidden) { LV_DISPINFO* lpdi = (LV_DISPINFO*)lParam; LPLV_ITEMDATA lplvid = (LPLV_ITEMDATA)lpdi->item.lParam; // SubItem 0 is handled only if (lpdi->item.iSubItem != 0) return FALSE; // Text if (lpdi->item.mask & LVIF_TEXT) IL_GetDisplayName(lplvid->lpsf, lplvid->pidl, SHGDN_INFOLDER, lpdi->item.pszText, lpdi->item.cchTextMax); // Set values lpdi->item.mask |= LVIF_DI_SETITEM; return TRUE; }
//============================================================================= // // DriveBox_SelectDrive // BOOL DriveBox_SelectDrive(HWND hwnd,LPCWSTR lpszPath) { COMBOBOXEXITEM cbei; LPDC_ITEMDATA lpdcid; WCHAR szRoot[64]; int i; int cbItems = (int)SendMessage(hwnd,CB_GETCOUNT,0,0); // No Drives in Combo Box if (!cbItems) return FALSE; cbei.mask = CBEIF_LPARAM; for (i = 0; i < cbItems; i++) { // Get DC_ITEMDATA* of Item i cbei.iItem = i; SendMessage(hwnd,CBEM_GETITEM,0,(LPARAM)&cbei); lpdcid = (LPDC_ITEMDATA)cbei.lParam; // Get File System Path for Drive IL_GetDisplayName(lpdcid->lpsf,lpdcid->pidl,SHGDN_FORPARSING,szRoot,64); // Compare Root Directory with Path if (PathIsSameRoot(lpszPath,szRoot)) { // Select matching Drive SendMessage(hwnd,CB_SETCURSEL,i,0); return TRUE; } } // Don't select anything SendMessage(hwnd,CB_SETCURSEL,(WPARAM)-1,0); return FALSE; }
//============================================================================= // // DirList_GetItem() // // Copies the data of the specified item in the listview control to a buffer // int DirList_GetItem(HWND hwnd,int iItem,LPDLITEM lpdli) { LV_ITEM lvi; LPLV_ITEMDATA lplvid; ULONG dwAttributes = SFGAO_FILESYSTEM; if (iItem == -1) { if (ListView_GetSelectedCount(hwnd)) iItem = ListView_GetNextItem(hwnd,-1,LVNI_ALL | LVNI_SELECTED); else return(-1); } lvi.mask = LVIF_PARAM; lvi.iItem = iItem; lvi.iSubItem = 0; if (!ListView_GetItem(hwnd,&lvi)) { if (lpdli->mask & DLI_TYPE) lpdli->ntype = DLE_NONE; return(-1); } lplvid = (LPLV_ITEMDATA)lvi.lParam; // Filename if (lpdli->mask & DLI_FILENAME) IL_GetDisplayName(lplvid->lpsf,lplvid->pidl,SHGDN_FORPARSING, lpdli->szFileName,MAX_PATH); // Displayname if (lpdli->mask & DLI_DISPNAME) IL_GetDisplayName(lplvid->lpsf,lplvid->pidl,SHGDN_INFOLDER, lpdli->szDisplayName,MAX_PATH); // Type (File / Directory) if (lpdli->mask & DLI_TYPE) { WIN32_FIND_DATA fd; if (NOERROR == SHGetDataFromIDList(lplvid->lpsf, lplvid->pidl, SHGDFIL_FINDDATA, &fd, sizeof(WIN32_FIND_DATA))) lpdli->ntype = (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? DLE_DIR : DLE_FILE; /*lplvid->lpsf->lpVtbl->GetAttributesOf( lplvid->lpsf, 1, &lplvid->pidl, &dwAttributes); lpdli->ntype = (dwAttributes & SFGAO_FOLDER) ? DLE_DIR : DLE_FILE;*/ } return iItem; }