实际工作开发中,由于各种应用,我们需要调用系统的打开文件对话框或者打开文件夹对话框,或两者兼有。特总结了常用的实现方法,仅供开发参考。

  1、 打开文件对话框

  常用的方法是使用系统的CFileDialog。

  在此介绍另外一种方法就是使用OPENFILENAME结构和GetOpenFileName()函数,可以实现单选文件或者多选文件,代码如下:

  注意:包含头文件 #include "CommDlg.h"

TCHAR szBuffer[MAX_PATH] = {};
OPENFILENAME ofn = {};
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = m_hWnd;
ofn.lpstrFilter = _T("exe文件(*.exe)\0*.exe\0所有文件(*.*)\0*.*\0"); // 文件过滤
ofn.lpstrInitialDir = _T("D:\\Program Files"); // 默认文件目录
ofn.lpstrFile = szBuffer;
ofn.nMaxFile = sizeof(szBuffer)/sizeof(*szBuffer);
ofn.nFilterIndex = ;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER ;
BOOL bSel = GetOpenFileName(&ofn);
if (bSel)
{
::MessageBox(NULL, szBuffer, TEXT("SignalSelect"), MB_OK);
}

  上面的代码演示了打开单个文件的情况,下面的代码则演示了如何得到多选的情况下选择的文件名。

OPENFILENAME ofn;
TCHAR szOpenFileNames[ * MAX_PATH] = {};
TCHAR szPath[MAX_PATH] = {};
TCHAR szFileName[ * MAX_PATH] = {};
TCHAR* p = NULL;
int nLen = ;
ZeroMemory( &ofn, sizeof(ofn) );
ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT;
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szOpenFileNames;
ofn.nMaxFile = sizeof(szOpenFileNames);
ofn.lpstrFile[] = '\0';
ofn.lpstrFilter = TEXT("All Files(*.*)\0*.*\0");
if( GetOpenFileName( &ofn ) )
{
lstrcpyn(szPath, szOpenFileNames, ofn.nFileOffset );
szPath[ ofn.nFileOffset ] = '\0';
nLen = lstrlen(szPath);
if( szPath[nLen-] != '\\' ) //如果选了多个文件,则必须加上'//'
{
lstrcat(szPath, TEXT("\\"));
}
p = szOpenFileNames + ofn.nFileOffset; //把指针移到第一个文件
ZeroMemory(szFileName, sizeof(szFileName));
while( *p )
{
lstrcat(szFileName, szPath); //给文件名加上路径
lstrcat(szFileName, p); //加上文件名
lstrcat(szFileName, TEXT("\n"));
p += lstrlen(p) +; //移至下一个文件
}
::MessageBox(NULL, szFileName, TEXT("MultiSelect"), MB_OK);
}

      2、打开文件夹对话框

  打开文件夹对话框使用BROWSEINFO结构和SHBrowseForFolder ()函数。

  注意:包含头文件 #include "Shlobj.h"

// 选择单个目录

TCHAR szBuffer[MAX_PATH] = {};
BROWSEINFO bi;
ZeroMemory(&bi,sizeof(BROWSEINFO));
bi.hwndOwner = NULL;
bi.pszDisplayName = szBuffer;
bi.lpszTitle = _T("从下面选文件夹目录:");
bi.ulFlags = BIF_RETURNFSANCESTORS;
LPITEMIDLIST idl = SHBrowseForFolder(&bi);
if (NULL == idl)
{
  return;
}
SHGetPathFromIDList(idl,szBuffer);
::MessageBox(NULL, szBuffer, TEXT("FolderSelect"), MB_OK);                                     

// 选择单个目录,带新建文件夹

TCHAR szPath[_MAX_PATH] = {};
BROWSEINFO bi;
bi.hwndOwner = NULL;
bi.pidlRoot = NULL;
bi.lpszTitle = _T("选择工程目录");
bi.pszDisplayName = szPath;
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; //标记新建按钮
bi.lpfn = NULL;
bi.lParam = NULL;
LPITEMIDLIST pItemIDList = SHBrowseForFolder(&bi);
if(pItemIDList)
{
SHGetPathFromIDList(pItemIDList, szPath);
::MessageBox(NULL, szPath, TEXT("FolderSelect"), MB_OK);
} IMalloc * imalloc = ;
if ( SUCCEEDED(SHGetMalloc( &imalloc)))
{
imalloc->Free(pItemIDList);
imalloc->Release();
}
// 选择文件或目录
TCHAR szBuffer[MAX_PATH] = {};
BROWSEINFO bi;
ZeroMemory(&bi,sizeof(BROWSEINFO));
bi.hwndOwner = NULL;
bi.pszDisplayName = szBuffer;
bi.lpszTitle = _T("从下面选择文件或文件夹:");
bi.ulFlags = BIF_BROWSEINCLUDEFILES;
LPITEMIDLIST idl = SHBrowseForFolder(&bi);
if (NULL == idl)
{
return;
}
SHGetPathFromIDList(idl,szBuffer);
::MessageBox(NULL, szBuffer, TEXT("Folder/File Select"), MB_OK); 

好了,几种简单的实现就介绍到这里,如果有更好的方法请扩展分享,分享的快乐才是双倍的快乐!

VC++ 打开文件或文件夹对话框的实现方法的更多相关文章

  1. VC++打开对话框选择一个文件夹路径 BROWSEINFO结构

    typedef struct _browseinfoW { HWND hwndOwner; PCIDLIST_ABSOLUTE pidlRoot; LPWSTR pszDisplayName; // ...

  2. Qt打开外部程序和文件夹需要注意的细节(Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错)

    下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this ...

  3. MFC中打开选择文件夹对话框,并将选中的文件夹地址显示在编辑框中

    一般用于选择你要将文件保存到那个目录下,此程序还包含新建文件夹功能 BROWSEINFO bi; ZeroMemory(&bi, sizeof(BROWSEINFO));  //指定存放文件的 ...

  4. CFileDialog(文件夹对话框类)和CFontDialog(字体设置对话框类)的使用学习

    CFileDialog(文件夹对话框类) 主要用于文件的保存,另存,打开,关闭等功能 功能“另存为”的实现: void CTXTDlg::OnFileSaveas() { LPCTSTR szFilt ...

  5. CFileDialog 打开文件夹文件 保存文件夹文件

    格式说明: explicit CFileDialog(    BOOL bOpenFileDialog,                         //TRUE 为打开, FALSE 为保存 L ...

  6. VC如何得到一个文件夹的路径

    VC中没有现成的函数来选择一个文件夹,但这是经常会用到的,怎么办?自动动手,丰衣足食! 使用SHBrowseForFolder,代码如下: #include   int SelFolder(HWND ...

  7. Qt打开外部程序和文件夹需要注意的细节(注意QProcess的空格问题,以及打开本地文件时,需要QUrl::fromLocalFile才可以)

    下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this ...

  8. 给JAVA的eclipse IDE 在线安装 SVN插件 / 给 eclipse 添加打开所在的文件夹功能

    http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA 首先,在这个网址找着最新在线安装链接 就是那个 Links for ...

  9. myeclipse,eclipse打开当前文件所在文件夹

    方法一: eclipse打开当前文件所在文件夹的插件Run-->External Tools-->External Tools Configurations...new 一个 progra ...

随机推荐

  1. destoon的如何显示tag生成的sql语句

    destoon 如何显示tag生成的sql语句 在tag.func.php中第117行加入 echo $query;  就只可以了

  2. Solr学习之三 solr配置说明之一

    严格来说,我这篇内容,主要是根据Solr in Action关于配置的说明,以及参考Solr的wiki写的算是读书笔记吧,所有的图片默认来自Solr in Action这本书. 这本书我觉得对学习So ...

  3. sass的学习笔记

    sass初学入门笔记(一) 我本身是个新手,一边学sass一边记下的笔记,可能有点罗嗦,但是复习起来的话还是比较全面直观的.当然,最重要的还是去实践,实践得真理 其它 CSS 预处理器语言: CSS ...

  4. Ribbon负载均衡策略与自定义配置new

    Ribbon负载均衡策略 配置 对调用的某个服务启用某种负载策略 1)通过配置文件配置 hello: ribbon: NFLoadBalancerRuleClassName:com.netflix.l ...

  5. Tomcat的URL中文乱码解决以及传输优化

    默认的tomcat容器如果直接使用get方式在url中传中文时,传到后台接收会是乱码. 乱码问题 原因: tomcat默认的在url传输时是用iso8859-1编码. 解决方案一: 在使用get传输参 ...

  6. Java web项目中java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

    原来是tomcat找不到MYSQL JAR包的问题.后来又把mysql-connector-java-5.1.7-bin.jar导入到tomcat的lib目录下面就ok了,嘿…… 在java项目中,只 ...

  7. SharePoint自动化系列——通过Coded UI录制脚本自动化创建SharePoint Designer Reusable Workflow

    Coded UI非常好,我开始还在想,怎么样能让一个通过SharePoint Designer创建的Workflow publish三百五十次?想不到一个好的方法,也不知道SharePoint Des ...

  8. 【Visual Studio】切换版本控制工具插件

    需求:安装了VS的某些版本控制工具的插件(比如Svn的插件AnkhSvn),但是打开VS后依然使用的是默认的版本控制工具,想要切换. Tool –> Options –> Source C ...

  9. ubuntu 16.04 上opengl 的安装以及例子程序编译执行

    因为最近在移植 Qt5.7 + opengl , 遇到了难以越过的山峰,没有办法,试着在 ubuntu 16.04上将 opengl 配置以下,记录: 安装相关的库: sudo apt-get ins ...

  10. DataGridView使用技巧一:获取或设置当前单元格的内容

    当前单元格指的是DataGridView焦点所在的单元格,它可以通过DataGridView对象的CurrentCell属性取得.如果当前单元格不存在的时候,返回null. 取得当前单元格的内容: o ...