1. 程式人生 > 實用技巧 >選擇資料夾

選擇資料夾

介紹 正如我在另一篇文章“CIconDialog -選擇圖示”中提到的,在開發一個嚮導應用程式時,我需要一個從可執行檔案中選擇圖示的對話方塊和另一個用於在多個檔案中選擇資料夾的對話方塊,但是在MFC中沒有找到任何關於它的內容。因此,CFolderDialog被編寫了出來。它封裝了::SHBrowseForFolder API。 示例使用 CFolderDialog派生自CCommonDialog,其行為類似於任何普通對話方塊。看到示例用法:隱藏,複製Code

//...
#ifndef __FOLDERDLG_H__
    #include "FolderDlg.h"
#endif
// ...
void CSomeDialog::OnSomeHandler( void ) 
{ 
    m_strFolderPath = _T( "d:\\Windows" ); // Just for sample    
    m_strDisplayName.Empty();
    
    CFolderDialog dlg(  _T( "Dialog Title" ), m_strFolderPath, this );
    if( dlg.DoModal() == IDOK  )
    {    
        m_strFolderPath  = dlg.GetFolderPath();
        m_strDisplayName = dlg.GetFolderDisplayName();
        // Use folder path and display name here ...
    }    
}
//

看到演示專案來源。 設定根資料夾 您還可以設定對話方塊的根資料夾,指定開始瀏覽的根資料夾的位置。在名稱空間層次結構中,只有指定的資料夾和它下面的任何子資料夾將出現在對話方塊中。 看到示例用法:隱藏,複製Code

//...
#ifndef __FOLDERDLG_H__
    #include "FolderDlg.h"
#endif
// ...
void CSomeDialog::OnSomeHandler( void ) 
{
    CFolderDialog dlg( _T( "Root folder is C:\" ), NULL, this );
    dlg.SetRootFolder( _T( "C:\\" );
    
    if( dlg.DoModal() == IDOK  )
    {       
        // ...
    }
}
//

感謝Eckhard Schwabe和Jose Insa提供的樣本。 自定義篩選 在Microsoft®Windows®XP/2003或更高版本下,您可以對對話方塊的內容進行自定義過濾。 要建立一個自定義過濾器,請遵循以下步驟: 在CFolderDialog建構函式的uFlags成員中設定BIF_NEWDIALOGSTYLE標誌。重寫派生類中的唯一未知虛擬成員函式。在OnIUnknown上,函式的pIUnknown引數將包含一個指向IUnknown例項的指標。在IUnknown上呼叫QueryInterface來獲得一個指向IFolderFilterSite的指標。 建立一個實現IFolderFilter的物件——從中派生一個類,該類實現IUnknown的所有基本的純虛擬成員函式,並實現IFolderFilterSite::ShouldShow和IFolderFilterSite::GetEnumFlags函式,它們執行過濾。 呼叫IFolderFilterSite::SetFilter(在步驟1中獲得的指標),給它傳遞一個指向自定義IFolderFilter派生類的指標。然後可以使用IFolderFilterSite::ShouldShow和IFolderFilterSite::GetEnumFlags方法來包含和排除樹中的項。 一旦建立了過濾器,就不再需要IFolderFilterSite介面了。如果你不再使用它,呼叫IFolderFilterSite::Release。 我添加了一個示例自定義過濾(看圖片,對話方塊中只顯示“JPG/GIF/BMP”檔案)。感謝Arik Poznanski撰寫的文章“c#實現Shell,第1部分”。有關更多資訊,請參閱原始碼。 類成員 基類 CCommonDialog 資料成員 m_bi - Windows的瀏覽器結構。提供對基本資料夾對話方塊引數的訪問。 包含對話方塊中所選資料夾的路徑。 包含對話方塊開啟時最初選擇的資料夾路徑。 建設 構造一個CFolderDialog物件:隱藏複製Code

CFolderDialog( IN LPCTSTR pszTitle = NULL, IN LPCTSTR pszSelPath = 
      NULL, IN CWnd* pWndParent = NULL, IN UINT uFlags = BIF_RETURNONLYFSDIRS )

顯示在對話方塊頂部的標題。 pszSelPath—對話方塊開啟時最初要選擇的資料夾路徑。 pWndParent -指向檔案對話方塊物件的父視窗或所有者視窗的指標。 uFlags -一個或多個標誌的組合,允許您自定義對話方塊。有關更多資訊,請參見平臺SDK中的BROWSEINFO結構。 操作 DoModal(void)顯示“瀏覽資料夾”對話方塊,並允許使用者進行選擇。 SetSelectedFolder(在LPCTSTR pszPath中)——設定對話方塊開啟時最初選擇的資料夾路徑。 SetRootFolder(在LPCTSTR pszPath中)——設定要顯示的根資料夾路徑。如果pszPath為空,則刪除根資料夾。 GetRootFolder(輸出LPTSTR pszPath)——獲取對話方塊的根資料夾。pszPath緩衝區的大小必須至少為MAX_PATH字元。 GetSelectedFolder(void) const——獲取對話方塊開啟時最初選擇的資料夾路徑。 GetFolderPath(void)常量—檢索開啟的資料夾的路徑。 GetFolderDisplayName(void)常量—檢索當前開啟的資料夾的顯示名稱。 獲取與所選資料夾相關聯的影象。該映像被指定為系統映像列表的索引。 GetBI(void)—檢索CFolderDialog物件的BROWSEINFO結構。 GetBI(void)常量——檢索CFolderDialog物件的BROWSEINFO結構。 重寫的 OnInitialized(void)——在瀏覽對話方塊完成初始化時呼叫。 OnSelChanged(在LPITEMIDLIST pItemIDList中)-當瀏覽對話方塊選擇被更改時呼叫。 OnValidateFailed(在LPCTSTR pszPath中)——當用戶在瀏覽對話方塊的編輯框(如果有的話)中鍵入無效名稱時呼叫。返回零允許取消對話方塊,返回非零保持對話方塊開啟。 Microsoft®Windows®XP/2003或更高版本: 使用IFolderFilterSite和IFolderFilter為客戶端提供一個IUnknown介面,用於定製對話方塊內容的過濾。 函式,只有在重寫時才有效呼叫: EnableOK(在BOOL bEnable = TRUE中)-啟用或禁用瀏覽對話方塊的OK按鈕。 SetSelection(在-選擇指定的資料夾。 SetSelection(在LPCTSTR pszPath中)——選擇指定的資料夾。 SetStatusText(在LPCTSTR pszText中)——設定對話方塊狀態文字。 Shell版本5.0或更高版本: setexpand(在LPITEMIDLIST pItemIDList中)-指定要在對話方塊中展開的路徑。 setexpand(在LPCTSTR pszPath中)——指定要在對話方塊中展開的路徑。 設定對話方塊“OK”按鈕的文字。 筆記 如果您將此專案轉換為vc7.0或更高版本,不要忘記新增shlwapi.dll到延遲載入dll列表中,因為它使用了shlwapi.dll 5.0的::StrRetToStr函式。開啟“[專案屬性]>[配置屬性]>[連結器]>[輸入]”,並將“shlwapi.dll;”新增到“[延遲載入dll]”列表中。vc6.0專案使用“/DelayLoad”連結器選項,不支援vc7.0或更高版本。 版本歷史 2002年3月27日 發表這篇文章。 2003年3月30 一些程式碼更改。 增加了舊平臺SDK中缺少的新標誌定義。 增加了對MFC 6.0和7.0的支援。 為Microsoft®Windows®XP資料夾過濾增加了OnIUnknown處理程式。 新增setexpand, SetOKText和GetSelectedFolder函式。 2003年5月30日 添加了OnSelChanged預設實現。 2003年7月14日 為Microsoft®Windows®XP/2003或更高版本添加了自定義過濾樣本。 setsetexpand和SetOKText到noinline。 2004年1月07 增加了SetRootFolder和GetRootFolder功能。 改變IFolderFilter實現。 2005年2月15日 多虧了WindSeven,修復了DoModal中的小bug。 本文轉載於:http://www.diyabc.com/frontweb/news4979.html