2015-07-20 42 views
0

我正在使用以下代碼片段來啓動文件夾對話框。限制用戶選擇某個特定的文件夾

BROWSEINFO bi; 
ZeroMemory(&bi, sizeof(bi)); 
TCHAR szDisplayName[MAX_PATH]; 
szDisplayName[0] = 'a'; 

bi.hwndOwner  = NULL; 
bi.pidlRoot   = NULL; 
bi.pszDisplayName = szDisplayName; 
bi.lpszTitle  = _T("Please select a folder to locate your PGA :"); 
bi.ulFlags   = BIF_RETURNONLYFSDIRS; 
bi.lParam   = NULL; 
bi.iImage   = 0; 

LPITEMIDLIST pidl = SHBrowseForFolder(&bi); 
TCHAR szPathName[MAX_PATH]; 
if (NULL != pidl) 
{ 
    BOOL bRet = SHGetPathFromIDList(pidl,szPathName); 
    if(FALSE == bRet) 
    { 
      return; 
    } 
    else 
    { 
     PGA_PATH.Clear(); 
     PGA_PATH.SetWindowTextA(szPathName);//To set the user selected path to the text box 
     SetValudata(szPathName);//to save the user selected path to the file. 

    } 
} 

現在我想限制用戶限制如果用戶試圖選擇某個特定的文件夾(PGA)。

例如。 如果用戶選擇的路徑=

    C:\Users\mm232\Desktop\PGA 

        C:\Users\mm232\Pictures\PGA 

        C:\Users\mm232\\PGA\Pictures 

然後不允許用戶選擇的路徑或禁用選擇。

+0

爲什麼不能:1)檢查選定的文件夾名稱,2)顯示一個消息框,3)重新顯示瀏覽對話框? –

+0

@Roger Rowland我想禁用選擇。如果用戶想選擇這種類型的路徑,不要讓用戶選擇。 –

+1

此[鏈接](https://msdn.microsoft.com/en-us/library/windows/desktop/bb762115(v = vs.85).aspx)解釋了要執行的操作。看看「自定義篩選」部分。這比你的proposaé更好,因爲你可以從列表中排除不需要的文件夾,所以用戶甚至不知道它們存在。 –

回答

1

文件夾瀏覽器對話框速度慢,因爲它可能會啓動CD驅動器並啓動睡眠外部硬盤驅動器。一個好的設計將允許用戶將路徑輸入到文本框中,然後在其旁邊添加一個瀏覽按鈕。然後在文本框中進行驗證,而不是在文件夾瀏覽對話框中進行驗證。

也就是說,您確實有選項可以阻止用戶通過在BROWSEINFO結構的lpfn成員中傳遞迴調函數來選擇某個文件夾。回調函數可以執行以下操作:

爲IFolderFilterSite處理BFFM_IUNKNOWN和QI lparam。用您自己的IFolderFilter實現調用IFolderFilterSite :: SetFilter來確定每個文件夾的可見性。

處理BFFM_SELCHANGED,檢查lparam傳遞的pidl併發送BFFM_ENABLEOK以啓用/禁用OK按鈕。或者,發送BFFM_SETSTATUSTEXT以顯示無法選擇文件夾的原因。

相關問題