| « | January 2026 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | |
| 公告 |
| 暂无公告... |
| 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:
由于此文章是工作时间仓促写就,所以文辞方面就没考虑,具体的看源代码吧。 |
|
|
回复:VC文件目录选择对话框(任意目录) 原创空间, 文章收藏, 软件技术
gg(游客)发表评论于2009/11/2 19:19:34 |
|
|
回复:VC文件目录选择对话框(任意目录) 原创空间, 文章收藏, 软件技术
xxx(游客)发表评论于2008/12/1 20:36:49 |
|
» 1 »
|