您的位置:首页 > 其它

SHBrowseForFolder 打开默认路径

2014-01-27 15:14 447 查看
转自:http://blog.csdn.net/shuilan0066/article/details/7302904

一般的路径方式如下:

 BROWSEINFO bi;

 ZeroMemory(&bi,sizeof(BROWSEINFO));

 LPMALLOC pMalloc;

 LPITEMIDLIST pidl = SHBrowseForFolder(&bi);

 if (pidl==NULL)

   return;

 if(pidl != NULL)

 {

  TCHAR * path = new TCHAR[MAX_PATH]; 

  

  SHGetPathFromIDList(pidl,path);

  //  MessageBox(NULL,path,TEXT("Choose"),MB_OK);

  if(SUCCEEDED(SHGetMalloc(&pMalloc)))//pidl指向的对象用完应该释放,之前忽略了

  {

   pMalloc->Free(pidl);

   pMalloc->Release();

  }

  m_filePath=path;

  UpdateData(FALSE); 

     delete [] path;

 }

这样打开的是根目录,每次都定位到根目录中, 很是麻烦

能不能打开指定的目录呢? 答案是肯定的

 

第1步: 建立类的CALLBACK函数

public:

 static int CALLBACK  BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)

 {

  switch(uMsg)

  {

  case BFFM_INITIALIZED:    //初始化消息

   ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)(LPTSTR)(LPCTSTR)m_filePath);   //  m_filePath 为类的静态变量

   break;

  case BFFM_SELCHANGED:    //选择路径变化,

   {

    TCHAR curr[MAX_PATH];  

    SHGetPathFromIDList((LPCITEMIDLIST)lParam,curr);  

    ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)curr);  

   }

   break;

  default:

   break;

  }

  return 0;  

 }

第2步:指定BROWSEINFO bi的相关信息

 BROWSEINFO bi;

 ZeroMemory(&bi,sizeof(BROWSEINFO));

 TCHAR szDefaultDir[MAX_PATH];

 CString strDef(_T("C:\\WINDOWS\\"));

 memcpy(szDefaultDir,strDef.GetBuffer(strDef.GetLength()*2),strDef.GetLength()*2);

 strDef.ReleaseBuffer();

 szDefaultDir[strDef.GetLength()]=0;

 bi.hwndOwner = this->GetSafeHwnd();

 bi.pidlRoot = 0;

 bi.pszDisplayName = 0;

 bi.lpszTitle = L"选择路径";

 bi.ulFlags = BIF_STATUSTEXT;

 bi.lpfn = BrowseCallbackProc ;        //设置CALLBACK函数

 bi.iImage = 0;

 bi.lParam = long(&szDefaultDir);    //设置默认路径

 LPMALLOC pMalloc;

 LPITEMIDLIST pidl = SHBrowseForFolder(&bi);

 if (pidl==NULL)

   return;

 if(pidl != NULL)

 {

  TCHAR * path = new TCHAR[MAX_PATH]; 

  

  SHGetPathFromIDList(pidl,path);

  if(SUCCEEDED(SHGetMalloc(&pMalloc)))//pidl指向的对象用完应该释放

  {

   pMalloc->Free(pidl);

   pMalloc->Release();

  }

  m_filePath=path;

  // 将路径保存在文件中

  CString pathSet;

  pathSet=m_exePath+L"UnionPicSet.ini";

  WritePrivateProfileString(_T("Path"),_T("DirectoryPath"),m_filePath,pathSet);

  UpdateData(FALSE); 

     delete [] path;

 }

翻译自:

http://blog.csdn.net/reallyioio/article/details/2948755



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: