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

Posted daggex

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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);
    }
}

 

以上是关于关于VC弹出选择文件夹对话框的主要内容,如果未能解决你的问题,请参考以下文章

windows10家庭版,下载一个VC++,打开安装包的时弹出了一个对话框,说“文件名、目录名或卷语法不确

VC++ MFC关于全局勾子的执行次数问题,高手帮助!成功调用以后,按下F9会弹出两次对话框,求解?只要执行一

急急急!!请问各位高手:为啥VC生成的release版本在无VC环境的机器上不能弹出对话框?

vc编程DoModal弹不出对话框

Xcode 运行cocos2dx弹出内部错误对话框

VC单击按钮弹出对话框都有哪些方法?