VC++ 打開文件或文件夾對話框的實現方法


       實際工作開發中,由於各種應用,我們需要調用系統的打開文件對話框或者打開文件夾對話框,或兩者兼有。特總結了常用的實現方法,僅供開發參考。

  1、 打開文件對話框

  常用的方法是使用系統的CFileDialog。

  在此介紹另外一種方法就是使用OPENFILENAME結構和GetOpenFileName()函數,可以實現單選文件或者多選文件,代碼如下:

  注意:包含頭文件 #include "CommDlg.h"

TCHAR szBuffer[MAX_PATH] = {0};  
OPENFILENAME ofn = {0};  
ofn.lStructSize = sizeof(ofn);  
ofn.hwndOwner = m_hWnd;  
ofn.lpstrFilter = _T("exe文件(*.exe)\0*.exe\0所有文件(*.*)\0*.*\0");   // 文件過濾
ofn.lpstrInitialDir = _T("D:\\Program Files");                                            // 默認文件目錄
ofn.lpstrFile = szBuffer; 
ofn.nMaxFile = sizeof(szBuffer)/sizeof(*szBuffer);  
ofn.nFilterIndex = 0;  
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER ;
BOOL bSel = GetOpenFileName(&ofn);
if (bSel)
{
      ::MessageBox(NULL, szBuffer, TEXT("SignalSelect"), MB_OK);
}

 

  上面的代碼演示了打開單個文件的情況,下面的代碼則演示了如何得到多選的情況下選擇的文件名。

OPENFILENAME ofn;
TCHAR szOpenFileNames[80 * MAX_PATH] = {0};
TCHAR szPath[MAX_PATH] = {0};
TCHAR szFileName[80 * MAX_PATH] = {0};
TCHAR* p = NULL;
int nLen = 0;
ZeroMemory( &ofn, sizeof(ofn) );
ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT;
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szOpenFileNames;
ofn.nMaxFile = sizeof(szOpenFileNames);
ofn.lpstrFile[0] = '\0';
ofn.lpstrFilter = TEXT("All Files(*.*)\0*.*\0");
if( GetOpenFileName( &ofn ) )
{ 
           lstrcpyn(szPath, szOpenFileNames, ofn.nFileOffset );
           szPath[ ofn.nFileOffset ] = '\0';
           nLen = lstrlen(szPath);
           if( szPath[nLen-1] != '\\' )                        //如果選了多個文件,則必須加上'//'
           {
                    lstrcat(szPath, TEXT("\\"));
           }
           p = szOpenFileNames + ofn.nFileOffset;              //把指針移到第一個文件
           ZeroMemory(szFileName, sizeof(szFileName));
           while( *p )
           {  
                    lstrcat(szFileName, szPath);               //給文件名加上路徑 
                    lstrcat(szFileName, p);                    //加上文件名 
                    lstrcat(szFileName, TEXT("\n")); 
                    p += lstrlen(p) +1;                        //移至下一個文件
           }
           ::MessageBox(NULL, szFileName, TEXT("MultiSelect"), MB_OK);
}

 

 

      2、打開文件夾對話框

  打開文件夾對話框使用BROWSEINFO結構和SHBrowseForFolder ()函數。

  注意:包含頭文件 #include "Shlobj.h"

    // 選擇單個目錄

TCHAR szBuffer[MAX_PATH] = {0};  
BROWSEINFO bi;  
ZeroMemory(&bi,sizeof(BROWSEINFO));  
bi.hwndOwner = NULL;  
bi.pszDisplayName = szBuffer;  
bi.lpszTitle = _T("從下面選文件夾目錄:");  
bi.ulFlags = BIF_RETURNFSANCESTORS;  
LPITEMIDLIST idl = SHBrowseForFolder(&bi);  
if (NULL == idl)  
{  
  return;  
}  
SHGetPathFromIDList(idl,szBuffer);  
::MessageBox(NULL, szBuffer, TEXT("FolderSelect"), MB_OK);                                     

    // 選擇單個目錄,帶新建文件夾

TCHAR szPath[_MAX_PATH] = {0}; 
BROWSEINFO bi;
bi.hwndOwner = NULL;
bi.pidlRoot = NULL;
bi.lpszTitle = _T("選擇工程目錄"); 
bi.pszDisplayName = szPath;
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;            //標記新建按鈕 
bi.lpfn = NULL;
bi.lParam = NULL;
LPITEMIDLIST pItemIDList = SHBrowseForFolder(&bi);
if(pItemIDList) 
{ 
      SHGetPathFromIDList(pItemIDList, szPath);
      ::MessageBox(NULL, szPath, TEXT("FolderSelect"), MB_OK);
}    

IMalloc * imalloc = 0; 
if ( SUCCEEDED(SHGetMalloc( &imalloc))) 
{ 
       imalloc->Free(pItemIDList); 
       imalloc->Release(); 
} 
// 選擇文件或目錄
TCHAR szBuffer[MAX_PATH] = {0};  
BROWSEINFO bi;  
ZeroMemory(&bi,sizeof(BROWSEINFO));  
bi.hwndOwner = NULL;  
bi.pszDisplayName = szBuffer;  
bi.lpszTitle = _T("從下面選擇文件或文件夾:");  
bi.ulFlags = BIF_BROWSEINCLUDEFILES;  
LPITEMIDLIST idl = SHBrowseForFolder(&bi);  
if (NULL == idl)  
{  
       return;  
}  
SHGetPathFromIDList(idl,szBuffer);  
::MessageBox(NULL, szBuffer, TEXT("Folder/File Select"), MB_OK); 

    好了,幾種簡單的實現就介紹到這里,如果有更好的方法請擴展分享,分享的快樂才是雙倍的快樂!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM