打开路径选择对话框

来源:互联网 发布:网络投票公司 编辑:程序博客网 时间:2024/05/16 11:36
 

 

    一般的OpenDialog,得到的是文件夹名称,如果要想实现下面的效果,得到选择的路径,这个时候SHBrowseForFolder就派上用场了。

      下面的例子中返回路径,如果没有选,返回"",选择了路径,则返回选择的路径。

    char  *GetPath(HWND   hWnd,char   *pBuffer)  

  {  

    BROWSEINFO   bf;  

    LPITEMIDLIST   lpitem;  

    memset(&bf,0,sizeof   BROWSEINFO);  

    bf.hwndOwner=hWnd;  

    bf.lpszTitle="选择路径";  

    bf.ulFlags=BIF_RETURNONLYFSDIRS;     //属性你可自己选择  

    lpitem=SHBrowseForFolder(&bf);  

    if(lpitem==NULL)     //如果没有选择路径则返回   0  

        return   "";  

   

    //如果选择了路径则复制路径,返回路径长度  

   

    SHGetPathFromIDList(lpitem,pBuffer);  

    return   pBuffer;

  }   

  下面我们来解释一下这个函数用到的一些值的含义。

   1.  BROWSEINFO

      它是一个结构, 原型是

    typedef struct _browseinfo { 

    HWND hwndOwner;          // 弹出的dialog的父窗体的句柄

    LPCITEMIDLIST pidlRoot;  // 指向一个ITEMIDLIST的指针,我们会在后边介绍ITEMIDLIST结构,可空

    LPSTR pszDisplayName;    // 指向一个buffer,这个buffer用来存放用户选中的目录,buffer的size为MAX_PATH  

    LPCSTR lpszTitle;        //指向一个非空的string,用来显示树目录之上的指示信息

    UINT ulFlags;            // 指出了显示的文件夹的类型

    BFFCALLBACK lpfn;        //简单的记为NULL    

    LPARAM lParam;           // 当lpfn不为空时,把dialogbox的值传给回调函数lpfn

    int iImage;              // 系统的图标list的索引,当用户选中目录的时候,得到这个索引

} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;

    ulFlags的可能取值为:

    BIF_BROWSEFORCOMPUTER  ——只返回"我的电脑",当选中"我的电脑"之外的目录时,OK键为灰色

    BIF_BROWSEFORPRINTER       ——只返回"打印机",当选中"打印机"之外的目录时,OK键为灰色

    BIF_DONTGOBELOWDOMAIN   ——不包括"网上邻居"

    BIF_RETURNFSANCESTORS    ——只返回"我的文件",当选中"我的文件"之外的目录时,OK键为灰色

    BIF_RETURNONLYFSDIRS        ——同上

    BIF_STATUSTEXT                         ——Includes a status area in the dialog box. The callback can set the status text by sending messages to the dialog box.

2.  ITEMIDLIST 

   是一个结构,指明了默认浏览的根文件夹的位置,可以为空,那样的话,默认为桌面文件夹的文件目录.

   原型为

  typedef struct _ITEMIDLIST

  {  

    SHITEMID mkid;  // list of item identifers 

  } ITEMIDLIST, * LPITEMIDLIST;

  typedef const ITEMIDLIST * LPCITEMIDLIST;

3.  SHGetPathFromIDList函数

   原型是

   WINSHELLAPI BOOL WINAPI SHGetPathFromIDList(

    LPCITEMIDLIST pidl,  

    LPSTR pszPath 

   );

  反正记住配套使用就行了,哈哈~~

  如果是在bcb环境中使用,那么如果提示不能识别BROWSEINFO,则需加入头文件#i nclude <ShellAPI.h>

,然后在对应的.cpp的include之前#define   NO_WIN32_LEAN_AND_MEAN

原创粉丝点击