• 关于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)

     1 //选择文件夹对话框回调函数  
    2 int CALLBACK BrowseCallBackFun(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
    3 {
    4 switch(uMsg)
    5 {
    6 case BFFM_INITIALIZED: //选择文件夹对话框初始化
    7      //设置默认路径为lpData即'D:\'
    8 ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
    9 //在STATUSTEXT区域显示当前路径
    10 ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, lpData);
    11 //设置选择文件夹对话框的标题
    12 ::SetWindowText(hwnd, TEXT("请先设置个工作目录"));
    13 break;
    14 case BFFM_SELCHANGED: //选择文件夹变更时
    15 {
    16 TCHAR pszPath[MAX_PATH];
    17 //获取当前选择路径
    18 SHGetPathFromIDList((LPCITEMIDLIST)lParam, pszPath);
    19 //在STATUSTEXT区域显示当前路径
    20 ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, TRUE, (LPARAM)pszPath);
    21 }
    22 break;
    23 }
    24 return 0;
    25 }
    26
    28 void CTestDlg::OnBtnTest()
    29 {
    30 // TODO: Add your control notification handler code here
    31 TCHAR pszPath[MAX_PATH];
    32 BROWSEINFO bi;
    33 bi.hwndOwner = this->GetSafeHwnd();
    34 bi.pidlRoot = NULL;
    35 bi.pszDisplayName = NULL;
    36 bi.lpszTitle = TEXT("请选择文件夹");
    37 bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
    38 bi.lpfn = BrowseCallBackFun; //回调函数
    39 bi.lParam = (LPARAM)TEXT("D:\\"); //传给回调函数的参数,设置默认路径
    40 bi.iImage = 0;
    41
    42 LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
    43 if (pidl == NULL)
    44 {
    45 return;
    46 }
    47
    48 if (SHGetPathFromIDList(pidl, pszPath))
    49 {
    50 AfxMessageBox(pszPath);
    51 }
    52 }

    附图片:

    当然也可以设置选择文件对话框的其他样式,比如使其具有新增文件夹的功能,可如下实现

    bi.ulFlags        =        BIF_USENEWUI        

    附图:(改图来源于www.VCKBASE.com,本人电脑上安装的是VC6,不支持BIF_USENEWUI,请在VC2003+上尝试)

    具体请参照MSDN



  • 相关阅读:
    python函数嵌套的实用技术
    windows10 装linux子系统
    彻底测试全部拷贝list相关操作的区别python
    c语言学习
    Pickling
    Filenames and paths
    Format operator
    Reading and writing
    Persistence
    Automation testing tool comparison
  • 原文地址:https://www.cnblogs.com/Hisin/p/2370614.html
Copyright © 2020-2023  润新知