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

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

         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; }

         


         

 

你可能感兴趣的:(null,Path,callback)