关于使用getopenfilename多选多个文件是可以的。
以下是多选文件的代码
1 bool GetNeedOpenFilePath(vector<tstring>& vectFiles, HWND hwnd ) 2 { 3 OPENFILENAME ofn; 4 TCHAR szOpenFileNames[80*MAX_PATH] = {0}; 5 TCHAR szPath[MAX_PATH]; 6 TCHAR szFileName[80*MAX_PATH]; 7 8 int nLen = 0; 9 TCHAR* p = NULL; 10 ZeroMemory(&ofn, sizeof(ofn)); 11 12 ofn.lStructSize = sizeof(ofn); 13 ofn.hwndOwner = hwnd; 14 //ofn.hInstance = (HMODULE)GetCurrentProcess(); 15 ofn.lpstrFile = szOpenFileNames; 16 ofn.nMaxFile = sizeof(szOpenFileNames); 17 ofn.lpstrFile[0] = _T('\0'); 18 ofn.lpstrFilter = _T("All Files(*.*)\0*.*\0\0"); 19 ofn.nFilterIndex = 1; 20 ofn.lpstrFileTitle = NULL; 21 ofn.nMaxFileTitle = 0; 22 ofn.lpstrTitle = I18NSTR(L"#IDS_FILESYSTEM_OPEN_FILE_DIR"); 23 ofn.Flags = OFN_ENABLESIZING | OFN_FILEMUSTEXIST| OFN_ALLOWMULTISELECT| OFN_HIDEREADONLY /*| OFN_ENABLEHOOK *//*| OFN_ENABLEINCLUDENOTIFY*/| OFN_EXPLORER; 24 //ofn.lpfnHook = OFNHookProc; 25 if (!::GetOpenFileName(&ofn)) //如果打开文件失败,则不操作 26 { 27 return false; 28 } 29 30 //把第一个文件名前的复制到szPath,即: 31 //如果只选了一个文件,就复制到最后一个'/' 32 //如果选了多个文件,就复制到第一个NULL字符 33 lstrcpyn(szPath,szOpenFileNames,ofn.nFileOffset); 34 35 //当只选了一个文件时,下面这个NULL字符是必需的. 36 //这里不区别对待选了一个和多个文件的情况 37 38 szPath[ofn.nFileOffset] = '\0'; 39 nLen = lstrlen(szPath); 40 if (szPath[nLen-1] != '\\') //如果选了多个文件,则必须加上'//' 41 { 42 lstrcat(szPath,_T("\\")); 43 } 44 45 p = szOpenFileNames + ofn.nFileOffset; //把指针移到第一个文件 46 ZeroMemory(szFileName, sizeof(szFileName)); 47 48 while(*p) 49 { 50 //lstrcat(szFileName, szPath); //给文件名加上路径 51 //lstrcat(szFileName, p); //加上文件名 52 tstring tstrFile = _UTILITY::TCHARToUnicode(p); 53 tstring tstrFilePath = szPath; 54 tstrFilePath += tstrFile; 55 vectFiles.push_back(tstrFilePath); 56 //lstrcat(szFileName, _T("\n")); //换行 57 p += lstrlen(p) + 1; //移至下一个文件 58 } 59 60 return true; 61 }
但是关于使用getopenfilename()函数获取多选文件夹的路径问题,需要自定义一些模板资源。具体实现方式还需研究下。
使用getsavefilename()函数可以获取另存为路径:
1 bool GetSaveAsFilePath(tstring tstrFilePath, HWND hwnd) 2 { 3 OPENFILENAME ofn; 4 TCHAR szOpenFileNames[80*MAX_PATH] = {0}; 5 TCHAR szPath[MAX_PATH]; 6 TCHAR szFileName[80*MAX_PATH]; 7 8 int nLen = 0; 9 TCHAR* p = NULL; 10 ZeroMemory(&ofn, sizeof(ofn)); 11 12 ofn.lStructSize = sizeof(ofn); 13 ofn.hwndOwner = NULL; 14 //ofn.hInstance = (HMODULE)GetCurrentProcess(); 15 ofn.lpstrFile = szOpenFileNames; 16 ofn.nMaxFile = sizeof(szOpenFileNames); 17 ofn.lpstrFile[0] = _T('\0'); 18 ofn.lpstrFilter = _T("All Files(*.*)\0*.*\0\0"); 19 ofn.nFilterIndex = 1; 20 ofn.lpstrFileTitle = NULL; 21 ofn.nMaxFileTitle = 0; 22 ofn.lpstrTitle = I18NSTR(L"#IDS_FILESYSTEM_SAVE_AS"); 23 ofn.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_EXPLORER; 24 ofn.FlagsEx = OFN_EX_NOPLACESBAR; 25 //ofn.lpfnHook = OFNHookProc; 26 if (!::GetSaveFileName(&ofn)) //如果打开文件失败,则不操作 27 { 28 return false; 29 } 30 31 tstrFilePath = ofn.lpstrFile; 32 return true; 33 }