目录选择对话框

来源:互联网 发布:spice语音优化 编辑:程序博客网 时间:2024/05/22 15:05

 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结构传递的参数
    );
 
原创粉丝点击