MFC获取文件夹路径,使用SHBrowseForFolder类

    CFileDialog类使得用户可以通过弹出的对话框选择一个文件,但却无法实现对文件夹的选择,不过可以通过SHBrowseForFolder实现,但使用它用户看到的将是一个树状控件。
      要使用这个函数,首先要弄清楚BROWSEINFO结构: 
hwndOwner: handle to the owner window of the dialog box
pidRoot: 指向一个结构的指针,这个指针用来说明在树状控件中开始浏览的文件夹,只有它以及它的子文件夹会显示在对话框                 中,可以简单地设置为NULL,这样对话框中将从桌面开始显示
pszDisplayName: 指向一个buffer的指针,用来保存用户选择的文件夹的名称,也可以简单地设置为NULL
lpszTitle:指定对话框的title
ulFlags:设置对话框的选项
BIF_RETURNONLYFSDIRS: 只返回文件系统文件夹,如果用户选择的文件夹不是文件系统的一部分,OK按钮将是灰色的
lpfn: 指向一个回调函数的指针
lParam:如果指定了回碉函数,从对话眶传递给回调函数的参数

iImage:这个的用处不太清楚


以BROWSEINFO为参数调用SHBrowseForFolder,如果成功,再调用SHGetPathFromIDList从返回的结果中获取到选择的文件夹的全路径


BROWSEINFO   bInfo;  
ZeroMemory(&bInfo,   sizeof(bInfo));  
bInfo.hwndOwner   =   m_hWnd;  
TCHAR   tchPath[255];  
bInfo.lpszTitle   =   _T(" 请选择路径:   ");  
bInfo.ulFlags   =   BIF_RETURNONLYFSDIRS;          
   
LPITEMIDLIST   lpDlist;  
//用来保存返回信息的IDList,使用SHGetPathFromIDList函数转换为字符串  
lpDlist   =   SHBrowseForFolder(&bInfo)   ;   //显示选择对话框  
if(lpDlist   !=   NULL)  
{  
SHGetPathFromIDList(lpDlist,   tchPath);//把项目标识列表转化成目录  
TRACE(tchPath);  
}
 
 
//实例
BROWSEINFO bi;  
 char buffer[MAX_PATH];  
 ZeroMemory(buffer,MAX_PATH);  
 bi.hwndOwner=GetSafeHwnd();  
 bi.pidlRoot=NULL;  
 bi.pszDisplayName=buffer;  
 bi.lpszTitle="选择一个文件夹";  
 bi.ulFlags=BIF_EDITBOX;  
 bi.lpfn=NULL;  
 bi.lParam=0;  
 bi.iImage=0;
 LPITEMIDLIST pList=NULL;  
 if((pList=SHBrowseForFolder(&bi))!=NULL)  
 {  
  char path[MAX_PATH];
  ZeroMemory(path,MAX_PATH);
  SHGetPathFromIDList(pList,path);
  GetDlgItem(IDC_EDADD)->SetWindowText(path);
 }

猜你喜欢

转载自blog.csdn.net/qq_25810695/article/details/80512071