void CDirectoriesPropertyPage::OnDropFiles(HDROP dropInfo) { // // Get the number of pathnames (files or folders) dropped // UINT nNumFilesDropped = DragQueryFile(dropInfo, 0xFFFFFFFF, NULL, 0); UINT m_dropMode = DL_ACCEPT_FOLDERS; // // Iterate through the pathnames and process each one // TCHAR szFilename[MAX_PATH + 1]; CString csPathname; CString csExpandedFilename; for (UINT nFile = 0 ; nFile < nNumFilesDropped; nFile++) { // // Get the pathname // DragQueryFile(dropInfo, nFile, szFilename, MAX_PATH + 1); // // It might be shortcut, so try and expand it // csPathname = szFilename; csExpandedFilename = ExpandShortcut(csPathname); if(!csExpandedFilename.IsEmpty()) { csPathname = csExpandedFilename; } // // Now see if its something we allow to be dropped // UINT iPathType = 0; if(ValidatePathname(csPathname, iPathType)) { // // By default, we insert the filename into the list // ourselves, but if our parent wants to do something flashy // with it (maybe get the filesize and insert that as an extra // column), they will have installed a callback for each // droppped item // if(m_dropMode & DL_USE_CALLBACK) { // // Let them know about this list control and the item // droppped onto it // //if(m_dropMode.pfnCallback) // m_dropMode.pfnCallback(this, csPathname, iPathType); } else { m_IncludeDirectoriesList.AddString(csPathname); } } } // // Free the dropped-file info that was allocated by windows // DragFinish(dropInfo); }
void CDropEdit::OnDropFiles(HDROP dropInfo) { // Get the number of pathnames that have been dropped WORD wNumFilesDropped = DragQueryFile(dropInfo, -1, NULL, 0); CString firstFile=""; // get all file names. but we'll only need the first one. for (WORD x = 0 ; x < wNumFilesDropped; x++) { // Get the number of bytes required by the file's full pathname WORD wPathnameSize = DragQueryFile(dropInfo, x, NULL, 0); // Allocate memory to contain full pathname & zero byte char * npszFile = (char *) LocalAlloc(LPTR, wPathnameSize += 1); // If not enough memory, skip this one if (npszFile == NULL) continue; // Copy the pathname into the buffer DragQueryFile(dropInfo, x, npszFile, wPathnameSize); // we only care about the first if (firstFile=="") firstFile=npszFile; // clean up LocalFree(npszFile); } // Free the memory block containing the dropped-file information DragFinish(dropInfo); // if this was a shortcut, we need to expand it to the target path CString expandedFile = ExpandShortcut(firstFile); // if that worked, we should have a real file name if (expandedFile!="") firstFile=expandedFile; struct _stat buf; // get some info about that file int result = _stat( firstFile, &buf ); if( result == 0 ) { // verify that we have a dir (if we want dirs) if ((buf.st_mode & _S_IFDIR) == _S_IFDIR) { if (m_bAllowDirs) SetWindowText(firstFile); SetSel(firstFile.GetLength(), firstFile.GetLength()); } // verify that we have a file (if we want files) else if ((buf.st_mode & _S_IFREG) == _S_IFREG) { if (m_bAllowFiles) SetWindowText(firstFile); SetSel(firstFile.GetLength(), firstFile.GetLength()); } } }