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<windows.h> //打开保存文件对话框 #include<Commdlg.h> //选择文件夹对话框 #include<Shlobj.h> #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; }
效果图: