VC++ 打开文件或文件夹对话框的实现方法
实际工作开发中,由于各种应用,我们需要调用系统的打开文件对话框或者打开文件夹对话框,或两者兼有。特总结了常用的实现方法,仅供开发参考。
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++ 打开文件或文件夹对话框的实现方法的更多相关文章
- VC++打开对话框选择一个文件夹路径 BROWSEINFO结构
typedef struct _browseinfoW { HWND hwndOwner; PCIDLIST_ABSOLUTE pidlRoot; LPWSTR pszDisplayName; // ...
- 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 ...
- MFC中打开选择文件夹对话框,并将选中的文件夹地址显示在编辑框中
一般用于选择你要将文件保存到那个目录下,此程序还包含新建文件夹功能 BROWSEINFO bi; ZeroMemory(&bi, sizeof(BROWSEINFO)); //指定存放文件的 ...
- CFileDialog(文件夹对话框类)和CFontDialog(字体设置对话框类)的使用学习
CFileDialog(文件夹对话框类) 主要用于文件的保存,另存,打开,关闭等功能 功能“另存为”的实现: void CTXTDlg::OnFileSaveas() { LPCTSTR szFilt ...
- CFileDialog 打开文件夹文件 保存文件夹文件
格式说明: explicit CFileDialog( BOOL bOpenFileDialog, //TRUE 为打开, FALSE 为保存 L ...
- VC如何得到一个文件夹的路径
VC中没有现成的函数来选择一个文件夹,但这是经常会用到的,怎么办?自动动手,丰衣足食! 使用SHBrowseForFolder,代码如下: #include int SelFolder(HWND ...
- Qt打开外部程序和文件夹需要注意的细节(注意QProcess的空格问题,以及打开本地文件时,需要QUrl::fromLocalFile才可以)
下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this ...
- 给JAVA的eclipse IDE 在线安装 SVN插件 / 给 eclipse 添加打开所在的文件夹功能
http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA 首先,在这个网址找着最新在线安装链接 就是那个 Links for ...
- myeclipse,eclipse打开当前文件所在文件夹
方法一: eclipse打开当前文件所在文件夹的插件Run-->External Tools-->External Tools Configurations...new 一个 progra ...
随机推荐
- canvas.drawBitmap(bitmap, src, dst, paint)
// GameView.drawImage(canvas, mBitDestTop, miDTX, mBitQQ.getHeight(), mBitDestTop.getWidth(), mBitDe ...
- python @property使用详解
1.@property,@xx.setter的作用把方法变成属性@property获取属性@xx.setter设置属性 2.使用示例 #@property使用 class Lang(object): ...
- ubuntu16.04中文乱码解决方案
把环境变量设置为中文 </pre><pre name="code" class="plain">sudo vi /etc/default ...
- 汉诺塔X
Description 1,2,...,n表示n个盘子.数字大盘子就大.n个盘子放在第1根柱子上.大盘不能放在小盘上.在第1根柱子上的盘子是a[1],a[2],...,a[n]. a[1]=n,a[2 ...
- Python socket聊天室程序
http://blog.csdn.net/calling_wisdom/article/details/42524745 今天用python的socket模块实现了一个聊天室的程序 虽然功能比较简单, ...
- RTX——第17章 定时器组
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 RTX 支持的定时器组,或者叫软件定时器,或者叫用户定时器均可.软件定时器的功能比较简 ...
- VBA学习笔记(6)--抽取第一列中叫“虹虹”的个人信息
说明(2017.3.25): 1. 知识点为dim arr2(1 to 1000, 1 to 4)先定义一个足够大的二维数组,不然后面需要transpose转置成一维数组. '抽取列表中叫“虹虹”的所 ...
- C语言 · 十六进制转八进制
基础练习 十六进制转八进制 时间限制:1.0s 内存限制:512.0MB 锦囊1: 使用二进制. 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的 ...
- eclipse安装中文补丁包
第一步:打开http://www.eclipse.org/babel/ 第二步:找到downloads. 第三步:点击Oxygen. 第四步:找到简体中文的zip插件并兵下载. 第五步:解压. 第六步 ...
- e682. 获得打印页的尺寸
Note that (0, 0) of the Graphics object is at the top-left of the actual page, which is outside the ...