zz:利用SHBrowseForFolder 产生路径选择对话框 同时指向默认路径文件夹

如何打开选择路径对话框?现在就用一些代码来说明,如下。

 TCHAR szPath[MAX_PATH];
 BROWSEINFO br;
 ITEMIDLIST* pItem;

 

 br.hwndOwner = this->GetSafeHwnd();
 br.pidlRoot = 0;
 br.pszDisplayName = 0;
 br.lpszTitle = "选择路径";
 br.ulFlags = BIF_STATUSTEXT;
 br.lpfn = 0;
 br.iImage = 0;
 br.lParam = 0;
 
 pItem = SHBrowseForFolder(&br);
 if(pItem != NULL)
 {
    if(SHGetPathFromIDList(pItem,szPath) == TRUE)
    {
        CString strDir = szPath;
    }

}

 

使用这段代码就可以打开选择路径的对话框,但是在这个打开的选择窗口中,每次打开时的默认路径都时系统的根目录,如何设置它的默认打开路径呢?

分步骤说明:

一 首先要写一个CALLBACK函数,如下

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");   //传递默认打开路径 (方法一)
   ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,lpData);        //传递默认打开路径 (方法二,前提是lpData提前设置好)

   break;
  case BFFM_SELCHANGED:    //选择路径变化,
   {
    char curr[MAX_PATH];  
    SHGetPathFromIDList((LPCITEMIDLIST)lParam,curr);  
    ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)curr);  
   }
   break;
  default:
   break;
 }

 return 0;  
}

二 前面所写的BROWSEINFO 的参数要重新设置成如下格式

 TCHAR szDefaultDir[MAX_PATH];

CString strDef(_T("C://WINDOWS//"));
 memcpy(szDefaultDir,strDef.GetBuffer(strDef.GetLength()),strDef.GetLength());
 strDef.ReleaseBuffer();

 

 TCHAR szPath[MAX_PATH];
 BROWSEINFO br;
 ITEMIDLIST* pItem;

 br.hwndOwner = this->GetSafeHwnd();
 br.pidlRoot = 0;
 br.pszDisplayName = 0;
 br.lpszTitle = "选择路径";
 br.ulFlags = BIF_STATUSTEXT;
 br.lpfn = BrowseCallbackProc ;        //设置CALLBACK函数
 br.iImage = 0;
 br.lParam = long(&szDefaultDir);    //设置默认路径
 //**转者注: 在Unicode环境下,编译测试,此处的默认路径无法起作用

 //**             需要手动转换成TChar/WChar

 //**             TChar strBuffer[MAX_PATH];

 //**             wcscpy(strBuffer, szDefaultDir);
 
 pItem = SHBrowseForFolder(&br);
 if(pItem != NULL)
 {
    if(SHGetPathFromIDList(pItem,szPath) == TRUE)
    {
     CString strDir = szPath;
    }
 }

 

OK,大功告成!

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/reallyioio/archive/2008/09/18/2948755.aspx

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值