如何使用“瀏覽文件夾”選擇對話窗

本文摘自:http://www.cnblogs.com/wangliang651/archive/2006/07/07/445473.html(稍作修改)

有時我們需要獲得某個文件夾的路徑,而不是文件的路徑,這時需要用API函數SHBrowseForFolder來實現。

函數原型爲:

LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi);

其中LPBROWSEINFO爲BROWSEINFO結構的指針。

Visual C++(VC)中,BROWSEINFO結構中包含有用戶選中目錄的重要信息,其結構如下:
typedef struct_browseinfo
{   
  HWND hwndOwner;   
  LPCITEMIDLIST pidlRoot;   
  LPSTR pszDisplayName;   
  LPCSTR lpszTitle;   
  UINT ulFlags;   
  BFFCALLBACK lpfn;   
  LPARAM lParam;   
  int iImage;   
}BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;

成員變量:
  hwndOwner:瀏覽文件夾對話框的父窗體句柄。   
  pidlRoot:ITEMIDLIST結構的地址,包含瀏覽時的初始根目錄,而且只有被指定的目錄和其子目錄才顯示在瀏覽文件夾對話框中。該成員變量可以是NULL,在此時桌面目錄將被使用。   
  pszDisplayName:用來保存用戶選中的目錄字符串的內存地址。該緩衝區的大小缺省是定義的MAX_PATH常量宏。   
  lpszTitle:該瀏覽文件夾對話框對話框的顯示文本,用來提示該瀏覽文件夾對話框的功能、作用和目的。   
  ulFlags:該標誌位描述了對話框的選項。它可以爲0,也可以是以下常量的任意組合:   
    BIF_BROWSEFORCOMPUTER:返回計算機名。除非用戶選中瀏覽器中的一個計算機名,否則該對話框中的“OK”按鈕爲灰色。   
    BIF_BROWSEFORPRINTER:返回打印機名。除非選中一個打印機名,否則“OK”按鈕爲灰色。   
    BIF_BROWSEINCLUDEFILES:瀏覽器將顯示目錄,同時也顯示文件。   
    BIF_DONTGOBELOWDOMAIN:在樹形視窗中,不包含域名底下的網絡目錄結構。   
    BIF_EDITBOX:瀏覽對話框中包含一個編輯框,在該編輯框中用戶可以輸入選中項的名字。   
    BIF_RETURNFSANCESTORS:返回文件系統的一個節點。僅僅當選中的是有意義的節點時,“OK”按鈕纔可以使用。   
    BIF_RETURNONLYFSDIRS:僅僅返回文件系統的目錄。例如:在瀏覽文件夾對話框中,當選中任意一個目錄時,該“OK”按鈕可用,而當選中“我的電腦”或“網上鄰居”等非有意義的節點時,“OK”按鈕爲灰色。   
    BIF_STATUSTEXT:在對話框中包含一個狀態區域。通過給對話框發送消息使回調函數設置狀態文本。   
    BIF_VALIDATE:當沒有BIF_EDITBOX標誌位時,該標誌位被忽略。如果用戶在編輯框中輸入的名字非法,瀏覽對話框將發送BFFM_VALIDATEFAILED消息給回調函數。   
  lpfn:應用程序定義的瀏覽對話框回調函數的地址。當對話框中的事件發生時,該對話框將調用回調函數。該參數可用爲NULL。   
  lParam:對話框傳遞給回調函數的一個參數指針。   
  iImage:與選中目錄相關的圖像。該圖像將被指定爲系統圖像列表中的索引值。

在VS2008下調用例子如下:

 

void CBrowseFolderDlg::OnBnClickedButton1()
{

CString sFolderPath;     //用來存儲路徑
 char szPath[MAX_PATH] = {0};

 BROWSEINFO m_bi;
 m_bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_EDITBOX ;
 m_bi.hwndOwner = GetSafeHwnd();
 m_bi.pidlRoot = NULL;
 m_bi.lpszTitle = _T("Select Folder");
 m_bi.lpfn = NULL;
 m_bi.lParam = NULL;
 m_bi.pszDisplayName = szPath;
 LPITEMIDLIST pidl= ::SHBrowseForFolder(&m_bi);
 
 if(pidl)
 {
  if(!::SHGetPathFromIDList(pidl,szPath))
  {
   szPath[0]=0;
  }
  sFolderPath = szPath;

  IMalloc* pMalloc = NULL;
  if(SUCCEEDED(::SHGetMalloc(&pMalloc)))
  {
   pMalloc ->Free(pidl);
   pMalloc ->Release();
  }
 }
 MessageBox(sFolderPath);

}

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章