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 ...
随机推荐
- ssh 远程执行命令 -t
# ssh -p22022 -t 122.16.67.116 ls -l /root/.ssh total -rw-r--r-- root root Jan : authorized_keys -rw ...
- js将时间戳转换成正常的yyyy-m-d格式
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- LeetCode: Anagrams 解题报告
AnagramsGiven an array of strings, return all groups of strings that are anagrams. Note: All inputs ...
- Web攻防系列教程之文件上传攻防解析(转载)
Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...
- R ggplot2 线性回归
摘自 http://f.dataguru.cn/thread-278300-1-1.html library(ggplot2) x=1:10y=rnorm(10)a=data.frame(x= x, ...
- 强大的CSS3动画库animate.css
今天要给大家介绍一款强大的CSS3动画库animate.css,animate.css定义了大概50多种动画形式,包括淡入淡出,文字飞入.左右摇摆动画等等.使用animate.css也非常简单,你可以 ...
- C语言 · 矩阵相乘 · 算法提高
算法提高 矩阵相乘 时间限制:1.0s 内存限制:256.0MB 问题描述 小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容. 当然 ...
- ContikiMAC RDC协议
http://www.mamicode.com/info-detail-1348767.html
- 机器学习:Mean Shift聚类算法
本文由ChardLau原创,转载请添加原文链接https://www.chardlau.com/mean-shift/ 今天的文章介绍如何利用Mean Shift算法的基本形式对数据进行聚类操作.而有 ...
- Xcode使用介绍
///// 应用程序文件的组织 Product Name:项目名字 Organization Name:组织机构名称 Company Identifier:公司唯一标识符 Bundle Identif ...