VC文件目录选择对话框(任意目录)

时间:2022-12-17 12:18:16

程序运行界面显示如下:

 

 

VC文件目录选择对话框(任意目录)

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

是的当用目录选择对话框时,用如下的结构打开。

以下是代码片段:
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:

 

由于此文章是工作时间仓促写就,所以文辞方面就没考虑,具体的请看源代码。