1。打开文件对话框:GetOpenFileName函数
BOOL WINAPI GetOpenFileName(
_Inout_ LPOPENFILENAME lpofn
);
参数:一个指向 OPENFILENAME 结构的指针,其中包含用于初始化对话框的信息。GetOpenFileName 返回时,此结构包含有关用户的文件选择的信息。
typedef struct tagOFN {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCTSTR lpstrFilter;
LPTSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPTSTR lpstrFile;
DWORD nMaxFile;
LPTSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCTSTR lpstrInitialDir;
LPCTSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCTSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
void *pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
#endif
} OPENFILENAME, *LPOPENFILENAME;
FlagsEx:
BOOL WINAPI GetSaveFileName(
_Inout_ LPOPENFILENAME lpofn
);
3。浏览选择文件夹:SHGetSpecialFolderLocation和SHGetPathFromIDList
PIDLIST_ABSOLUTE SHBrowseForFolder(
_In_ LPBROWSEINFO lpbi
);
lpbi:指向包含用来显示对话框中的信息的BROWSEINFO结构的指针。
返回值:返回指定的命名空间的根与所选的文件夹位置的PIDL。如果用户在对话框中选择取消按钮,返回值为NULL。
BROWSEINFO 结构:
typedef struct _browseinfo {
HWND hwndOwner;
PCIDLIST_ABSOLUTE pidlRoot;
LPTSTR pszDisplayName;
LPCTSTR lpszTitle;
UINT ulFlags;
BFFCALLBACK lpfn;
LPARAM lParam;
int iImage;
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;
hwndOwner:拥有者窗口句柄
pidlRoot:置NULL
pszDisplayName:接收文件夹路径的缓冲区指针
lpszTitle:对话框标题
ulFlags:为对话框中指定选项的标志
BIF_RETURNONLYFSDIRS:只返回文件系统目录。如果用户选择的文件夹不是文件系统的一部分,确定按钮显示为灰色。
BIF_DONTGOBELOWDOMAIN:不包括域级别下的网络文件夹对话框的树视图控件中。
BIF_EDITBOX:允许用户键入项目名称的浏览对话框中包含一个编辑控制。
BIF_VALIDATE:如果用户在编辑框中键入了无效的名称,浏览对话框中调用应用程序的BrowseCallbackProc与BFFM_VALIDATEFAILED消息。如果未指定 BIF_EDITBOX,则忽略此标志。
BIF_NEWDIALOGSTYLE:使用新的用户界面。将此标志设置为用户提供一个更大的对话框,可以调整大小。对话框中有几个新功能,包括: 在
对话框、 重新排序、 快捷菜单、 新文件夹、 删除和其他快捷菜单命令内的拖放功能。
BIF_USENEWUI:使用新的用户界面,包括编辑框。此标志是相当于 BIF_EDITBOX |BIF_NEWDIALOGSTYLE。
BIF_UAHINT:与 BIF_NEWDIALOGSTYLE 相结合,将用法提示添加到对话框中,在编辑框位置。BIF_EDITBOX 将覆盖此标志。
BIF_NONEWFOLDERBUTTON:在浏览对话框中不包括新文件夹按钮。
BIF_NOTRANSLATETARGETS:当选定的项是一条快捷方式时,返回快捷方式本身,而不是其目标。
BIF_BROWSEFORCOMPUTER:只有返回计算机。如果用户选择计算机之外的任何内容,OK 按钮显示为灰色。
BIF_BROWSEINCLUDEFILES:浏览对话框中显示的文件以及文件夹。
完整源码:
#include "stdafx.h"
#include
//打开保存文件对话框
#include
//选择文件夹对话框
#include
#pragma comment(lib,"Shell32.lib")
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine,
_In_ int nCmdShow)
{
loop:
OPENFILENAME ofn = { 0 };
TCHAR strFilename[MAX_PATH] = { 0 };//用于接收文件名
ofn.lStructSize = sizeof(OPENFILENAME);//结构体大小
ofn.hwndOwner = NULL;//拥有着窗口句柄,为NULL表示对话框是非模态的,实际应用中一般都要有这个句柄
ofn.lpstrFilter = TEXT("所有文件\0*.*\0C/C++ Flie\0*.cpp;*.c;*.h\0\0");//设置过滤
ofn.nFilterIndex = 1;//过滤器索引
ofn.lpstrFile = strFilename;//接收返回的文件名,注意第一个字符需要为NULL
ofn.nMaxFile = sizeof(strFilename);//缓冲区长度
ofn.lpstrInitialDir = NULL;//初始目录为默认
ofn.lpstrTitle = TEXT("请选择一个文件");//使用系统默认标题留空即可
ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;//文件、目录必须存在,隐藏只读选项
if (GetOpenFileName(&ofn))
{
MessageBox(NULL, strFilename, TEXT("选择的文件"), 0);
}
else{
MessageBox(NULL, TEXT("请选择一个文件"), NULL, MB_ICONERROR);
goto loop;
}
ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;//目录必须存在,覆盖文件前发出警告
ofn.lpstrTitle = TEXT("保存到");//使用系统默认标题留空即可
ofn.lpstrDefExt = TEXT("cpp");//默认追加的扩展名
if (GetSaveFileName(&ofn))
{
MessageBox(NULL, strFilename, TEXT("保存到"), 0);
}
else{
MessageBox(NULL, TEXT("请输入一个文件名"), NULL, MB_ICONERROR);
}
TCHAR szBuffer[MAX_PATH] = { 0 };
BROWSEINFO bi = { 0 };
bi.hwndOwner = NULL;//拥有着窗口句柄,为NULL表示对话框是非模态的,实际应用中一般都要有这个句柄
bi.pszDisplayName = szBuffer;//接收文件夹的缓冲区
bi.lpszTitle = TEXT("选择一个文件夹");//标题
bi.ulFlags = BIF_NEWDIALOGSTYLE;
LPITEMIDLIST idl = SHBrowseForFolder(&bi);
if (SHGetPathFromIDList(idl, szBuffer)){
MessageBox(NULL, szBuffer, TEXT("你选择的文件夹"), 0);
}
else{
MessageBox(NULL, TEXT("请选择一个文件夹"), NULL, MB_ICONERROR);
}
return 0;
}
效果图: