[Win32]打开文件/保存文件/选择文件夹对话框

本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处: http://blog.csdn.net/zuishikonghuan/article/details/47441163

1。打开文件对话框:GetOpenFileName函数

BOOL WINAPI GetOpenFileName(
  _Inout_ LPOPENFILENAME lpofn
);

参数:一个指向 OPENFILENAME 结构的指针,其中包含用于初始化对话框的信息。GetOpenFileName 返回时,此结构包含有关用户的文件选择的信息。

返回值:如果用户指定的文件名,并单击确定按钮,返回值不为零。指向的 OPENFILENAME 结构的 lpstrFile 成员在缓冲区中包含完整的路径和文件名称。如果用户取消或关闭打开对话框或发生错误,则返回值为零。
OPENFILENAME 结构:
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;

lStructSize:结构的长度,以字节为单位。此参数使用 sizeof (OPENFILENAME)。
hwndOwner:拥有该对话框的窗口的句柄。这个成员可以是任何有效的窗口句柄。如果对话框里有没有所有者,它可以为 NULL。
lpstrFilter:包含对 null 终止的筛选器字符串的缓冲区。缓冲区中的最后一个字符串必须以两个空字符终止。
每一对中的第一个字符串是一个显示字符串,描述了该筛选器 (例如,"文本文件"),和第二个字符串指定筛选器模式 (例如,"*.TXT")。若要指定多个筛选器模式为单显示字符串,请使用分号来分隔模式 (例如,""*.TXT;*.DOC;*.BAK")。模式字符串可以是有效的文件名字符,星号 (*) 通配符字符的组合。模式字符串中,则不要包含空格。
系统不会更改过滤器的顺序。它在 lpstrFilter 中指定的顺序文件类型组合框中显示它们。
如果 lpstrFilter 为 NULL,对话框中不显示任何筛选器。
比如:"所有文件\0*.*\0C/C++ Flie\0*.cpp;*.c;*.h\0\0"
nFilterIndex:在文件类型控件中当前选定的筛选器的索引。由 lpstrFilter 指向的缓冲区包含对定义的筛选器的字符串。字符串的第一双有索引值为 1,第二个配对 2,等等。
lpstrFile:用来初始化文件名称的文件名称的编辑控件。如果初始化是不必要的话,此缓冲区的第一个字符必须为 NULL。
当 GetOpenFileName 或 GetSaveFileName 函数成功返回时,该缓冲区包含驱动器符、 路径、 文件名称和所选文件的扩展名。
如果设置了 OFN_ALLOWMULTISELECT 标志,用户选择多个文件,在缓冲区中包含当前目录依次选定文件的文件名。对于资源管理器样式对话框,目录和文件的名称字符串是 NULL 分隔,用额外的空字符后最后一个文件的名称。旧样式对话框,以空格分隔的字符串,函数使用短文件名的文件名称用空格。您可以使用目录中函数长、 短文件名之间进行转换。如果用户选择只有一个文件,lpstrFile 字符串没有之间的路径和文件名称的分隔符。
nMaxFile:以字符数计算,lpstrFile 所指向的缓冲区的大小。缓冲区必须足够大以存储的路径和文件名称字符串或字符串,包括终止 NULL 字符。缓冲区应至少 256 个字符长。
lpstrInitialDir:初始目录。留空由系统选择,但选择的初始目录的算法在不同系统上各不相同
lpstrTitle:要放在对话框的标题栏中的字符串。如果此成员为 NULL,则系统使用默认标题 。
Flags:一组位标志,这个成员可以是下列标志的组合。
OFN_FILEMUSTEXIST:用户可以在文件名称输入字段中键入唯一的现有文件的名称。如果指定了此标志,用户输入一个无效的名称的对话框过程在消息框中显示一个警告。如果指定了此标志,则是还会使用 OFN_PATHMUSTEXIST 标志。在打开对话框中,可以使用此标志。它不能用另存为对话框。
OFN_PATHMUSTEXIST: 用户 可以 键入 只有 有效 路径 文件名 如果 使用 标志 并且 用户 文件 名称 输入 字段 键入 无效 路径 文件名 对话框 函数 消息 框中 显示 一个 警告
OFN_HIDEREADONLY:隐藏“以只读打开”复选框。
OFN_NODEREFERENCELINKS:指示对话框返回选定快捷方式的路径和文件名称 (.LNK) 文件。如果不指定此值,则对话框返回快捷方式引用的文件的路径和文件名称。
OFN_NONETWORKBUTTON:隐藏和禁用网络按钮。
OFN_OVERWRITEPROMPT:另存为对话框:如果所选的文件已经存在。用户必须确认是否要覆盖该文件。
lpstrDefExt 默认 扩展名 GetOpenFileName GetSaveFileName 将追加 文件 名称 扩展 如果 用户 键入 扩展名 字符串 可以 任意 长度 只有 三个 字符 追加 字符串 包含 句点 (.)。 如果 成员 NULL 并且 用户没有 键入 扩展名 没有 扩展名 追加

FlagsEx

OFN_EX_NOPLACESBAR: 如果 设置 标志 显示 位置 如果 设置 标志 资源管理器样式 对话框 包括 一个 包含 用于 常用 文件夹 收藏夹 桌面 图标 地方

2。保存文件对话框:
BOOL WINAPI GetSaveFileName(
  _Inout_ LPOPENFILENAME lpofn
);

参数: 一个 指向 OPENFILENAME 结构的指针 其中包含 用于 初始化 对话框 信息 GetSaveFileName 返回 结构 包含 有关 用户的 文件 选择 信息 。(见上面)
返回值:如果用户指定的文件名,并单击确定按钮,返回值不为零。指向的 OPENFILENAME 结构的 lpstrFile 成员在缓冲区中包含完整的路径和文件名称。如果用户取消或关闭打开对话框或发生错误,则返回值为零。


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;
}

效果图:

[Win32]打开文件/保存文件/选择文件夹对话框_第1张图片

[Win32]打开文件/保存文件/选择文件夹对话框_第2张图片




你可能感兴趣的:(Win32,windows,Desktop,api)