现在的位置: 首页 > 综合 > 正文

使用目录选择对话框时,如何让其弹出后自动打开指定目录

2013年12月11日 ⁄ 综合 ⁄ 共 2661字 ⁄ 字号 评论关闭

使用目录选择对话框时,如何让其弹出后自动打开指定目录?

是的当用目录选择对话框时,用如下的结构打开。
typedef struct _browseinfo {
HWND hwndOwner;
LPCITEMIDLIST pidlRoot;
LPSTR pszDisplayName;
LPCSTR lpszTitle;
UINT ulFlags;
BFFCALLBACK lpfn;
LPARAM lParam;
int iImage;
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;

LPCITEMIDLIST pidlRoot; 这个就是 默认为桌面。

还有可以通过这种方式实现,如下:
LPMALLOC pMalloc;     
     if ( SUCCEEDED( SHGetSpecialFolderLocation (NULL, CSIDL_DRIVES, &pidl)))
     {
         SHELLEXECUTEINFO sei;
         ZeroMemory(&sei, sizeof(sei));
         sei.cbSize = sizeof(sei);
         sei.fMask = SEE_MASK_IDLIST;
         sei.lpIDList = pidl;
         sei.lpVerb = "open";
         sei.hwnd = AfxGetMainWnd()->GetSafeHwnd();
         sei.nShow = BIF_RETURNONLYFSDIRS;
         ShellExecuteEx(&sei);
         if (SUCCEEDED( SHGetMalloc (&pMalloc)))
         {
             pMalloc->Free ( pidl );
             pMalloc->Release();
         }
     }

其中://CSIDL_DRIVES是我的电脑
参数有好些,
CSIDL_BITBUCKET 回收站
CSIDL_CONTROLS 控制面板
CSIDL_DESKTOP Windows 桌面Desktop
CSIDL_DESKTOPDIRECTORY Desktop的目录
CSIDL_DRIVES 我的电脑
CSIDL_FONTS 字体目录
CSIDL_NETHOOD 网上邻居
CSIDL_NETWORK 网上邻居虚拟目录
CSIDL_PERSONAL 我的文档
CSIDL_PRINTERS 打印机
CSIDL_PROGRAMS 程序组
CSIDL_RECENT 最近打开的文档
CSIDL_SENDTO “发送到”菜单项
CSIDL_STARTMENU 任务条启动菜单项
CSIDL_STARTUP 启动目录
CSIDL_TEMPLATES 文档模板
还有的看 MSDN吧。

现在像论坛上的朋友,他要实现的是要打开 如:f:,f://site等这样的目录。
很明显这样的字符串是不被支持的,所以必须要转成 LPCITEMIDLIST 这种结构的才支持。
但微软好像没有类似的函数实现这样的功能。于是就写了一个如下:

//文件目录转成LPITEMIDLIST
LPITEMIDLIST CTestBrowseDlg::ParsePidlFromPath(LPCSTR path)
{    
     OLECHAR szOleChar[MAX_PATH];    
     LPSHELLFOLDER IpsfDeskTop;    
     LPITEMIDLIST lpifq;    
     ULONG ulEaten, ulAttribs;    
     HRESULT hres;    
     SHGetDesktopFolder(&IpsfDeskTop);    
     MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,path,-1,szOleChar,sizeof(szOleChar));    
     hres = IpsfDeskTop ->ParseDisplayName(NULL, NULL, szOleChar, &ulEaten, &lpifq, &ulAttribs);    
     hres=IpsfDeskTop->Release( );        
     if(FAILED(hres))
         return NULL;
     return lpifq;
}

如这样写:    
方法1:
LPITEMIDLIST pidl;
    
     LPMALLOC pMalloc;
     pidl = ParsePidlFromPath("F://site");//请先确定f:下有这个文件夹
    
     SHELLEXECUTEINFO sei;
     ZeroMemory(&sei, sizeof(sei));
     sei.cbSize = sizeof(sei);
     sei.fMask = SEE_MASK_IDLIST;
     sei.lpIDList = pidl;
     sei.lpVerb = "open";
     sei.hwnd = AfxGetMainWnd()->GetSafeHwnd();
     sei.nShow = BIF_RETURNONLYFSDIRS;
     ShellExecuteEx(&sei);
     if (SUCCEEDED( SHGetMalloc (&pMalloc)))
     {
         pMalloc->Free ( pidl );
         pMalloc->Release();
     }
就可以打开F:/site

方法2:
     CString str;
     BROWSEINFO bi;
     char name[MAX_PATH];
     ZeroMemory(&bi,sizeof(BROWSEINFO));    
     bi.pidlRoot = ParsePidlFromPath("F://");
     bi.hwndOwner=GetSafeHwnd();
     bi.pszDisplayName=name;
     bi.lpszTitle="S浏览文件夹";
     bi.ulFlags=BIF_RETURNONLYFSDIRS;
    
     LPITEMIDLIST idl=SHBrowseForFolder(&bi);
     if(idl==NULL)
         return;
就能打开f:

抱歉!评论已关闭.