登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

向左走,向右走

好的东西需要记下来^_^

 
 
 

日志

 
 

vc使用目录选择对话框  

2008-12-05 18:08:06|  分类: 技术类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

是的当用目录选择对话框时,用如下的结构打开。
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;
就能打开:

 

SHBrowseForFolder的用法
真正要灵活控制SHBrowseForFolder,需要使用它的回调函数,
下面的一段代码演示它的用法。具有两个特性
1。显示指定的路径
2。在路径选择状态提示中自动添加一个子目录。
int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
switch(uMsg){
case BFFM_INITIALIZED:
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)"C:\\Program Files");
break;
case BFFM_SELCHANGED:
{
char curr[MAX_PATH];
SHGetPathFromIDList((LPCITEMIDLIST)lParam,curr);
if(curr[strlen(curr)-1]==92)
sprintf(curr,"%sSictech",curr);
else
sprintf(curr,"%s\\Sictech",curr);
::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)curr);
}
break;
}
return 0;
}
void CSetPathDlg::OnGetPath()
{
// TODO: Add your control notification handler code here
char Path[MAX_PATH];
LPITEMIDLIST  ret;
BROWSEINFO lpbi;
lpbi.hwndOwner=m_hWnd;
lpbi.pidlRoot=NULL;
lpbi.ulFlags=BIF_STATUSTEXT;
lpbi.pszDisplayName=Path;
lpbi.lpszTitle="Get Path";
lpbi.lpfn=BrowseCallbackProc;
ret=SHBrowseForFolder(&lpbi);
if(ret!=NULL){
SHGetPathFromIDList(ret,Path);
if(Path[strlen(Path)-1]==92)
sprintf(Path,"%sSictech",Path);
else
sprintf(Path,"%s\\Sictech",Path);
}
}

///简单浏览的例子

 

 BROWSEINFO   bi;                       //BROWSEINFO结构体  
 char   Buffer[512];    
 bi.hwndOwner   =   m_hWnd;             //m_hWnd你的程序主窗口  
 bi.pidlRoot   =   NULL;  
 bi.pszDisplayName   =   Buffer;         //返回选择的目录名的缓冲区  
 bi.lpszTitle   =   "请选择目录";     //弹出的窗口的文字提示  
 bi.ulFlags   =   BIF_BROWSEINCLUDEFILES;//BIF_RETURNONLYFSDIRS|BIF_EDITBOX|BIF_BROWSEFORCOMPUTER   ;         //只返回目录。其他标志看MSDN  
 bi.lpfn   =   NULL;                                                 //回调函数,有时很用   

 bi.lParam   =   0;  
 bi.iImage   =   0;  
 ITEMIDLIST*   pidl   =   ::SHBrowseForFolder   (&bi);                 //显示弹出窗口,ITEMIDLIST很重要  
 ::SHGetPathFromIDList   (pidl,FullPath);
 if   (   pidl   ==   NULL   )    
  sprintf(FullPath,"%s","D:\\study\\Textures");  
 if   (!SHGetPathFromIDList(pidl,FullPath))
 {
  sprintf(FullPath,"%s","D:\\study\\Textures");
 }
 else
 {
  m_list4.InsertString(0,FullPath);
  if(IDOK==MessageBox("是否在新选择的目录下重新加载dds文件",NULL,MB_OKCANCEL))
  {
   BrowseDir(FullPath);
  }
 }
}

  评论这张
 
阅读(1884)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018