程序运行界面显示如下:
使用目录选择对话框时,如何让其弹出后自动打开指定目录?
是的当用目录选择对话框时,用如下的结构打开。
以下是代码片段: 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: |
由于此文章是工作时间仓促写就,所以文辞方面就没考虑,具体的请看源代码。