限制用户选择某个特定文件夹

时间:2015-07-20 08:06:45

标签: winapi mfc

我正在使用以下代码段来启动文件夹对话框。

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)。

例如。 如果用户选择了path =

                  C:\Users\mm232\Desktop\PGA 

                  C:\Users\mm232\Pictures\PGA

                  C:\Users\mm232\\PGA\Pictures

然后不允许用户选择路径或禁用选择。

1 个答案:

答案 0 :(得分:1)

文件夹浏览器对话框很慢,因为它可能会启动CD驱动器并打开睡眠外部硬盘驱动器的电源。一个好的设计将允许用户在文本框中键入路径,然后在它旁边添加一个浏览按钮。然后在textbbox上完成验证,而不是在文件夹浏览对话框中。

那就是说你确实有选项可以阻止用户通过在BROWSEINFO结构的lpfn成员中传递回调函数来选择某个文件夹。回调函数可以执行以下操作:

为IFolderFilterSite处理BFFM_IUNKNOWN和QI lparam。使用您自己的IFolderFilter实现调用IFolderFilterSite :: SetFilter,它确定每个文件夹的可见性。

处理BFFM_SELCHANGED,检查lparam中传递的pidl并发送BFFM_ENABLEOK以启用/禁用OK按钮。 (可选)发送BFFM_SETSTATUSTEXT以显示无法选择文件夹的原因。