您的位置:首页 > 其它

怎么显示一个可以选择目录的打开对话框

2010-07-16 18:03 573 查看
                                       怎么显示一个可以选择目录的打开对话框

         CFileDialog只可以让用户选中某个文件,并不能让用户选择某个文件夹。所以需要自己来做这个打开对话框。

            这是我写的一个封装的函数:输入默认路径,返回用户选中的路径。

           
//显示 文件夹对话框,获得用户的选择结果
tstring  CSelDialog::GetUserSelDirectory(tstring & strDefaultDir)
{
tstring  strSelectDir;

//默认的root路径
TCHAR   szDefaultDir[MAX_PATH];
_tcsncpy(szDefaultDir,strDefaultDir.c_str(),strDefaultDir.length());

//获得的路径缓存
TCHAR szPath[MAX_PATH];

//显示 选择文件夹对话框
BROWSEINFO  bf;
ZeroMemory(&bf,sizeof(BROWSEINFO));
bf.lParam=(LPARAM)szDefaultDir;
bf.lpfn=CallbackProc;
bf.lpszTitle=_T("请选择备份文件夹");
bf.ulFlags=BIF_STATUSTEXT|BIF_BROWSEINCLUDEFILES;

//相当于DoModule,最后的选择结果保存在strSelectDir 字符串中
LPITEMIDLIST   lpitem=SHBrowseForFolder(&bf);
if (lpitem!=NULL)
{
if(SHGetPathFromIDList(lpitem,szPath) == TRUE)
{
strSelectDir=szPath;
}
}

return   strSelectDir;
}
 

          这中间用到了一个回调函数:

          
//打开文件夹对话框的回调函数
int CALLBACK  CallbackProc(
HWND hwnd,
UINT uMsg,
LPARAM lParam,
LPARAM lpData
)
{
tstring   strRoot;
tstring   strCurr;

switch(uMsg)
{
//初始化
case BFFM_INITIALIZED:
{
strRoot=lpData;
strRoot=_T("D://BackData");
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,lpData);
}

break;
//选择发生改变
case BFFM_SELCHANGED:
{
TCHAR curr[MAX_PATH];
SHGetPathFromIDList((LPCITEMIDLIST)lParam,curr);

//在这里可以加上判断,如果选中的不是符合要求的目录,就可以灰掉“OK”按钮

//
if (不满足要求)
{
::SendMessage(hwnd, BFFM_ENABLEOK , 0, 0);
}
else
{
::SendMessage(hwnd, BFFM_ENABLEOK , 1, 1);
::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)curr);
}
}
break;

default:
break;
}

return  0;
}


         

         

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  path callback null
相关文章推荐