如何打开磁盘目录对话框(BrowseForFolder)

打开文件对话框相信很多人都已经懂了,那么如何通过打开对话框选择路径呢?这里就要介绍几个函数和结构体.

//文件夹信息结构
typedef struct _browseinfo {
  HWND hwndOwner;         //弹出目录对话框的父窗口
  LPCITEMIDLIST pidlRoot;//ITEMIDLIST结构的地址,包含浏览时的初始根目录 
  //如果设为NULL则桌面目录将被使用
  LPTSTR pszDisplayName;//用来保存用户选中的目录字符串的内存地址。该缓冲区的大小缺省是定义的MAX_PATH常量宏。
  LPCTSTR lpszTitle;//该浏览文件夹对话框的显示文本,用来提示该浏览文件夹对话框的功能、作用和目的。 
  UINT ulFlags;    //一般设0足以
  BFFCALLBACK lpfn;//应用程序定义的浏览对话框 回调函数的地址。当对话框中的事件发生时,该对话框将调用 回调函数。该参数可用为NULL。
  LPARAM lParam;//对话框传递给 回调函数的一个参数 指针
  int iImage;与选中目录相关的图像。该图像将被指定为系统图像列表中的索引值。
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;
//存放路径信息结构体
typedef struct _ITEMIDLIST { 
  SHITEMID mkid;
} ITEMIDLIST, *LPITEMIDLIST; 
typedef const ITEMIDLIST* LPCITEMIDLIST;
//显示对话框选择路径
LPITEMIDLIST WINAPI SHBrowseForFolder(
  LPBROWSEINFO lpbi //指向文件夹信息结构的指针
);

//获取ITEMIDLIST结构指针中的路径信息
WINSHELLAPI   BOOL   WINAPI   SHGetPathFromIDList(  
          LPCITEMIDLIST   pidl,  
          LPSTR   pszPath  
  ); 

代码如下:

    TCHAR szBrowsePath[MAX_PATH];
    ZeroMemory(szBrowsePath, sizeof(szBrowsePath));

    BROWSEINFO bi = { 0 };  //因为已经初始化为0.所以有些项不用再重复赋值了
    bi.hwndOwner = m_hWnd;
    bi.pszDisplayName = szBrowsePath;
    bi.lpszTitle = TEXT("请选择搜索路径:");


    LPITEMIDLIST lpiml = { 0 };
    lpiml = SHBrowseForFolder(&bi); //如果没有选中目录,则返回NULL
    if (lpiml && SHGetPathFromIDList(lpiml,szBrowsePath))//从lpiml 中获取路径信息
    {
        m_path = szBrowsePath;
        UpdateData(FALSE);
    } 
    else
    {
        AfxMessageBox(TEXT("请选择一个路径,或者手动输入!"));
    }

你可能感兴趣的:(搜索,磁盘,路径对话框)