关于VC弹出选择文件夹对话框

VC编程中经常需要弹出选择文件夹对话框供用户选择目标文件夹

基本实现的源码如下:

 1 void CTestDlg::OnBtnTest() 
 2 {
 3     // TODO: Add your control notification handler code here
 4     TCHAR pszPath[MAX_PATH];
 5     BROWSEINFO bi; 
 6     bi.hwndOwner      = this->GetSafeHwnd();
 7     bi.pidlRoot       = NULL;
 8     bi.pszDisplayName = NULL; 
 9     bi.lpszTitle      = TEXT("请选择文件夹"); 
10     bi.ulFlags        = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
11     bi.lpfn           = NULL; 
12     bi.lParam         = 0;
13     bi.iImage         = 0; 
14  
15     LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
16     if (pidl == NULL)
17     {
18         return;
19     }
20  
21     if (SHGetPathFromIDList(pidl, pszPath))
22     {
23         AfxMessageBox(pszPath);
24     }
25 }

这一般均能够满足要求,但有时还是需要在此基础上增强一些功能。

比如在弹出选择文件夹对话框时选中默认的文件夹,或在STATUSTEXT区域显示一些信息等等。这需要在BrowseCallbackProc回调函数中实现。具体实现的源码如下:

(具体BrowseCallBackFun回调函数的用法请参照MSDN)

//选择文件夹对话框回调函数
int CALLBACK BrowseCallBackFun(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
    switch(uMsg)
    {
    case BFFM_INITIALIZED:  //选择文件夹对话框初始化
        //设置默认路径为lpData即'D:\'
        ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
        //在STATUSTEXT区域显示当前路径
        ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, lpData);
        //设置选择文件夹对话框的标题
        ::SetWindowText(hwnd, TEXT("请先设置个工作目录")); 
        break;
    case BFFM_SELCHANGED:   //选择文件夹变更时
        {
            TCHAR pszPath[MAX_PATH];
            //获取当前选择路径
            SHGetPathFromIDList((LPCITEMIDLIST)lParam, pszPath);
            //在STATUSTEXT区域显示当前路径
            ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, TRUE, (LPARAM)pszPath);
        }
        break;
    }
    return 0;
}
 
 
void CTestDlg::OnBtnTest() 
{
    // TODO: Add your control notification handler code here
    TCHAR pszPath[MAX_PATH];
    BROWSEINFO bi; 
    bi.hwndOwner      = this->GetSafeHwnd();
    bi.pidlRoot       = NULL;
    bi.pszDisplayName = NULL; 
    bi.lpszTitle      = TEXT("请选择文件夹"); 
    bi.ulFlags        = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
    bi.lpfn           = BrowseCallBackFun;     //回调函数
    bi.lParam         = (LPARAM)TEXT("D:\\");  //传给回调函数的参数,设置默认路径
    bi.iImage         = 0; 
    
    LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
    if (pidl == NULL)
    {
        return;
    }
    
    if (SHGetPathFromIDList(pidl, pszPath))
    {
        AfxMessageBox(pszPath);
    }
}

猜你喜欢

转载自www.cnblogs.com/daggex/p/10162785.html