天天看点

目录选择对话框

 int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)//回调函数

{

 if (uMsg==BFFM_INITIALIZED)

 {

  //设置初始目录

  if (lpData)

   SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)lpData);

 }

 return TRUE;

}

CString getpath(CWnd* cw)

{

 char pBuffer[256];

 CString temp;

 char currentdirbuf[255]="";

 GetCurrentDirectory(255,currentdirbuf);

 BROWSEINFO bi;

 memset(&bi,0,sizeof(BROWSEINFO));

 bi.hwndOwner=cw->m_hWnd;

 bi.lpszTitle="生成程序前,先为ut文件选择保存文件夹";

 //bi.pszDisplayName=selectpath_or_lastpath.GetBuffer(0);

 bi.ulFlags=BIF_RETURNONLYFSDIRS;

 bi.lParam=(LPARAM)currentdirbuf;

 ATLTRACE("currentdirbuf=%s/n",currentdirbuf);

 bi.lpfn=BrowseCallbackProc;//回调函数

 ITEMIDLIST *pIDList = SHBrowseForFolder(&bi);

 if(pIDList)

 {

  SHGetPathFromIDList(pIDList,pBuffer);

  GlobalFree(pIDList);

  char systembuf[255]="";

  GetSystemDirectory(systembuf,255);

  strcat_s(systembuf,"//last_pathname.ini");

  CStdioFile file;

  file.Open(systembuf,CFile::modeCreate|CFile::modeWrite);

  file.SeekToBegin();

  file.WriteString(pBuffer);

  file.Close();

  //LPMALLOC pMalloc=NULL;

  //if (SUCCEEDED(SHGetMalloc(&pMalloc)))

  //{

  // pMalloc->Free(pIDList);

  // pMalloc->Release();

  // //return;

  //}

 }

 ATLTRACE("pBuffer=%s/n",pBuffer);

 temp.Format("%s",pBuffer);

 return temp;

}

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

   1.  BROWSEINFO

typedef struct _browseinfo {     HWND hwndOwner;         // 对话框所有者窗口的句柄     LPCITEMIDLIST pidlRoot; // 表示在哪个路径下选择,通常设为NULL     LPTSTR pszDisplayName; //[ 返回]所选目录的名称(不包含父级目录)被拷贝到这个指针指向的位置     LPCTSTR lpszTitle;      // 窗口上显示的提示语句     UINT ulFlags;           // 组合此对话框的元素标记     BFFCALLBACK lpfn;       // 事件产生时对话框调用的函数地址,一般不用,设置为NULL     LPARAM lParam;          // 传递给回调函数的参数     int iImage;             // 与所选目录相关联的图标在系统图标集合中的索引 } BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;

    它是一个结构, 原型是

    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.  把项目标示符表(LPITEMIDLIST类型,SHBrowseForFolder函数的返回值)转换为文件路径:

BOOL SHGetPathFromIDList(     LPCITEMIDLIST pidl, // 项目标示符表     LPTSTR pszPath       // 返回的文件路径 );

4.回调函数:

int CALLBACK BrowseCallbackProc(     HWND hwnd, // 浏览对话框的窗体句柄,用这句柄给上图对话框发消息改变其状态(SendMessage)     UINT uMsg,// 浏览对话框返回的消息     LPARAM lParam, // 消息参数     LPARAM lpData   //BROWSEINFO 结构传递的参数     );