本站首页    管理页面    写新日志    退出


«January 2026»
123
45678910
11121314151617
18192021222324
25262728293031


公告
暂无公告...

我的分类(专题)

日志更新

最新评论

留言板

链接


Blog信息
blog名称:
日志总数:21
评论数量:94
留言数量:1
访问次数:145889
建立时间:2006年1月9日




[Visual C++]VC文件目录选择对话框(任意目录)
原创空间,  文章收藏,  软件技术

joinclear 发表于 2006/6/8 22:46:48

转载自: http://www.vclife.net/articles/article_view.asp?atlid=48 使用目录选择对话框时,如何让其弹出后自动打开指定目录? 是的当用目录选择对话框时,用如下的结构打开。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 这种结构的才支持。但微软好像没有类似的函数实现这样的功能。于是就写了一个如下: //文件目录转成LPITEMIDLISTLPITEMIDLIST 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: 由于此文章是工作时间仓促写就,所以文辞方面就没考虑,具体的看源代码吧。


阅读全文(10990) | 回复(2) | 编辑 | 精华
 


回复:VC文件目录选择对话框(任意目录)
原创空间,  文章收藏,  软件技术

gg(游客)发表评论于2009/11/2 19:19:34

不错啊,谢谢啦


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:VC文件目录选择对话框(任意目录)
原创空间,  文章收藏,  软件技术

xxx(游客)发表评论于2008/12/1 20:36:49

学习下!谢谢

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144812567 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号