您的位置:首页 > 编程语言 > C语言/C++

c++选择文件夹对话框

2015-12-15 13:36 531 查看

1,目的

提供一个对话框供用户选择一个文件夹路径。

2,原理&实现

先贴上这个工具类的源码:

在你的程序中使用静态方法 CSelectFolderDlg::Show() 就能显示一个选择文件夹的对话框啦,返回的CString就是所选文件夹路径。

[cpp] view plaincopy





/*

文件:SelectFolderDlg.h

说明:提供一个选择文件夹的对话框

*/

#ifndef SELECT_FOLDER_DLG_H

#define SELECT_FOLDER_DLG_H

#ifndef BIF_NEWDIALOGSTYLE

#define BIF_NEWDIALOGSTYLE 0x0040

#endif

class CSelectFolderDlg

{

public:

//创建一个选择文件夹的对话框,返回所选路径

static CString Show()

{

TCHAR szFolderPath[MAX_PATH] = {0};

CString strFolderPath = TEXT("");

BROWSEINFO sInfo;

::ZeroMemory(&sInfo, sizeof(BROWSEINFO));

sInfo.pidlRoot = 0;

sInfo.lpszTitle = _T("请选择一个文件夹:");

sInfo.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;

sInfo.lpfn = NULL;

// 显示文件夹选择对话框

LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);

if (lpidlBrowse != NULL)

{

// 取得文件夹名

if (::SHGetPathFromIDList(lpidlBrowse,szFolderPath))

{

strFolderPath = szFolderPath;

}

}

if(lpidlBrowse != NULL)

{

::CoTaskMemFree(lpidlBrowse);

}

return strFolderPath;

}

};

#endif

简单说明下,

有个API可显示一个浏览文件夹的对话框,形式为:

LPITEMIDLIST WINAPI SHBrowseForFolder( LPBROWSEINFO lpbi);

参数就一个,这个结构定义:

[cpp] view plaincopy





typedef struct _browseinfo {

HWND hwndOwner; // 父窗口句柄

LPCITEMIDLIST pidlRoot; // 要显示的文件目录对话框的根(Root)

LPTSTR pszDisplayName; // 保存被选取的文件夹路径的缓冲区

LPCTSTR lpszTitle; // 显示位于对话框左上部的标题

UINT ulFlags; // 指定对话框的外观和功能的标志

BFFCALLBACK lpfn; // 处理事件的回调函数

LPARAM lParam; // 应用程序传给回调函数的参数

int iImage; // 文件夹对话框的图片索引

} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO

使用函数前我们建一个这个结构,填一些内容,可以对要显示的对话框做些配置:

[cpp] view plaincopy





BROWSEINFO sInfo;

::ZeroMemory(&sInfo, sizeof(BROWSEINFO));

sInfo.pidlRoot = 0;

sInfo.lpszTitle = _T("请选择一个文件夹:");

sInfo.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;

sInfo.lpfn = NULL;

这里设置了对话框显示的目录树根目录、标题、风格等。
现在就可以用它来显示一个“请选择一个文件夹”对话框了:

[cpp] view plaincopy





// 显示文件夹选择对话框

LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);

返回的 LPITEMIDLIST 是Windows Shell 用来唯一标识一个对象的结构,这里用它可以获取我们的路径值:

[cpp] view plaincopy





TCHAR szFolderPath[MAX_PATH] = {0};

::SHGetPathFromIDList(lpidlBrowse,szFolderPath);

3,效果





4,源码

vs2008工程下载:

http://yun.baidu.com/s/1i3wVm3z

[cpp] view plaincopy





<pre code_snippet_id="121664" snippet_file_name="blog_20131221_3_3217985"></pre>

<pre></pre>

<pre></pre>

<pre></pre>

<pre></pre>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: