效果图:
实现方式
#include<iostream>
#include<cstring>
#include<string>
#include<string.h>
#include <shlobj.h>
#define STRICT_TYPED_ITEMIDS
using namespace std;
int main()
{
OPENFILENAME ofn; // common dialog box structure
LPWSTR szFile =NULL; // buffer for file name
HWND hwnd =NULL; // owner window
HANDLE hf; // file handle
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
// Set lpstrFile[0] to '\0' so that GetOpenFileName does not
// use the contents of szFile to initialize itself.
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter =TEXT("All\0*.*\0Text\0*.TXT\0") ;
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
//ofn.lpstrInitialDir = NULL;
ofn.lpstrInitialDir = TEXT("D:\\");//默认的文件路径
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
// Display the Open dialog box.
if (GetOpenFileName(&ofn) == TRUE)
hf = CreateFile(ofn.lpstrFile,
GENERIC_READ,
0,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
(HANDLE)NULL);
return 0;
}
OPENFILENAME
包含 GetOpenFileName 和 GetSaveFileName 函数用于初始化 打开 或 另存为 对话框的信息。 用户关闭对话框后,系统会返回有关此结构中用户选择的信息。
语法
typedef struct tagOFNA {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
LPCSTR lpstrFilter;
LPSTR lpstrCustomFilter;
DWORD nMaxCustFilter;
DWORD nFilterIndex;
LPSTR lpstrFile;
DWORD nMaxFile;
LPSTR lpstrFileTitle;
DWORD nMaxFileTitle;
LPCSTR lpstrInitialDir;
LPCSTR lpstrTitle;
DWORD Flags;
WORD nFileOffset;
WORD nFileExtension;
LPCSTR lpstrDefExt;
LPARAM lCustData;
LPOFNHOOKPROC lpfnHook;
LPCSTR lpTemplateName;
LPEDITMENU lpEditInfo;
LPCSTR lpstrPrompt;
void *pvReserved;
DWORD dwReserved;
DWORD FlagsEx;
} OPENFILENAMEA, *LPOPENFILENAMEA;
成员
lStructSize
类型:DWORD
结构的长度(以字节为单位)。 用于
sizeof (OPENFILENAME)
此参数。
hwndOwner
类型:HWND
拥有对话框的窗口的句柄。 此成员可以是任何有效的窗口句柄,如果对话框没有所有者,则该成员可以为 NULL 。
hInstance
类型: HINSTANCE
如果在 Flags 成员中设置了OFN_ENABLETEMPLATEHANDLE标志,则 hInstance 是包含对话框模板的内存对象的句柄。 如果设置了 OFN_ENABLETEMPLATE 标志, 则 hInstance 是包含 由 lpTemplateName 成员命名的对话框模板的模块的句柄。 如果未设置两个标志,则忽略此成员。 如果设置了 OFN_EXPLORER 标志,系统会使用指定的模板创建一个对话框,该对话框是默认资源管理器样式对话框的子级。 如果未设置 OFN_EXPLORER 标志,系统会使用模板创建替换默认对话框的旧样式对话框。
lpstrFilter
类型: LPCTSTR
包含以 null 结尾的筛选器字符串对的缓冲区。 缓冲区中的最后一个字符串必须以两个 NULL 字符终止。
每对中的第一个字符串是一个显示字符串,描述筛选器 (,例如“文本文件”) ,第二个字符串指定筛选器模式 (例如
"*.TXT"*
*) 。 若要为单个显示字符串指定多个筛选器模式,请使用分号分隔模式 (例如
“
) 。 模式字符串可以是有效文件名字符和星号 (*) 通配符的组合。 不要在模式字符串中包含空格。.TXT;*.DOC;*”。BAK“
系统不会更改筛选器的顺序。 它按 lpstrFilter 中指定的顺序在文件类型组合框中显示它们。
如果 lpstrFilter 为 NULL,则对话框不显示任何筛选器。
对于快捷方式,如果未设置筛选器, 则 GetOpenFileName 和 GetSaveFileName 将检索 .lnk 文件的名称,而不是其目标。 此行为与在 Flags 成员中设置OFN_NODEREFERENCELINKS标志相同。 若要在不筛选的情况下检索快捷方式的目标,请使用字符串
"All Files\0*.*\0\0"
。
lpstrCustomFilter
类型: LPTSTR
一个静态缓冲区,其中包含一对以 null 结尾的筛选器字符串,用于保留用户选择的筛选器模式。 第一个字符串是描述自定义筛选器的显示字符串,第二个字符串是用户选择的筛选器模式。 应用程序第一次创建对话框时,指定第一个字符串,可以是任何无空字符串。 当用户选择文件时,对话框会将当前筛选器模式复制到第二个字符串。 保留的筛选器模式可以是 lpstrFilter 缓冲区中指定的模式之一,也可以是用户键入的筛选器模式。 系统使用字符串在下次创建对话框时初始化用户定义的文件筛选器。 如果 nFilterIndex 成员为零,则对话框使用自定义筛选器。
如果此成员为 NULL,则对话框不会保留用户定义的筛选器模式。
如果此成员不是 NULL, 则 nMaxCustFilter 成员的值必须指定 lpstrCustomFilter 缓冲区的大小(以字符为单位)。
nMaxCustFilter
类型:DWORD
由 lpstrCustomFilter 标识的缓冲区的大小(以字符为单位)。 此缓冲区长度应至少为 40 个字符。 如果 lpstrCustomFilter 为 NULL 或指向 NULL 字符串,则忽略此成员。
nFilterIndex
类型:DWORD
文件类型控件中当前所选筛选器的索引。 lpstrFilter 指向的缓冲区包含定义筛选器的字符串对。 第一对字符串的索引值为 1、第二对 2 等。 零的索引指示 lpstrCustomFilter 指定的自定义筛选器。 可以在输入上指定索引,以指示对话框的初始筛选器说明和筛选器模式。 当用户选择文件时, nFilterIndex 返回当前显示的筛选器的索引。 如果 nFilterIndex 为零, lpstrCustomFilter 为 NULL,则系统将使用 lpstrFilter 缓冲区中的第一个筛选器。 如果所有三个成员均为零或 NULL,则系统不使用任何筛选器,也不会在对话框的文件列表控件中显示任何文件。
lpstrFile
类型: LPTSTR
用于初始化文件名编辑控件的 文件名 。 如果不需要初始化,则此缓冲区的第一个字符必须为 NULL 。 当 GetOpenFileName 或 GetSaveFileName 函数成功返回时,此缓冲区包含所选文件的驱动器指示符、路径、文件名和扩展名。
如果设置了 OFN_ALLOWMULTISELECT 标志,并且用户选择多个文件,则缓冲区包含当前目录,后跟所选文件的文件名。 对于资源管理器样式的对话框,目录和文件名字符串以 NULL 分隔,最后一个文件名后面还有额外的 NULL 字符。 对于旧式对话框,字符串是空格分隔的,函数对带空格的文件名使用短文件名。 可以使用 FindFirstFile 函数在长文件名和短文件名之间进行转换。 如果用户仅选择一个文件, 则 lpstrFile 字符串在路径和文件名之间没有分隔符。
如果缓冲区太小,则函数返回 FALSE , CommDlgExtendedError 函数返回 FNERR_BUFFERTOOSMALL。 在这种情况下, lpstrFile 缓冲区的前两个字节包含所需的大小(以字节或字符为单位)。
nMaxFile
类型:DWORD
lpstrFile 指向的缓冲区的大小(以字符为单位)。 缓冲区必须足够大,才能存储路径和文件名字符串或字符串,包括终止 NULL 字符。 如果缓冲区太小而无法包含文件信息, 则 GetOpenFileName 和 GetSaveFileName 函数返回 FALSE 。 缓冲区长度应至少为 256 个字符。
lpstrFileTitle
类型: LPTSTR
文件名和扩展名 (没有所选文件的路径信息) 。 此成员可以为 NULL。
nMaxFileTitle
类型:DWORD
lpstrFileTitle 指向的缓冲区的大小(以字符为单位)。 如果 lpstrFileTitle 为 NULL,则忽略此成员。
lpstrInitialDir
类型: LPCTSTR
初始目录。 用于选择初始目录的算法因不同平台而异。
Windows 7:
- 如果 lpstrInitialDir 与首次使用 “打开 ”或“ 另存为 ”对话框传递的值相同,则用户最近选择的路径将用作初始目录。
- 否则,如果 lpstrFile 包含路径,则路径为初始目录。
- 否则,如果 lpstrInitialDir 不是 NULL,则指定初始目录。
- 如果 lpstrInitialDir 为 NULL ,并且当前目录包含指定筛选器类型的任何文件,则初始目录为当前目录。
- 否则,初始目录是当前用户的个人文件目录。
- 否则,初始目录为“桌面”文件夹。
Windows 2000/XP/Vista:
- 如果 lpstrFile 包含路径,则路径为初始目录。
- 否则, lpstrInitialDir 指定初始目录。
- 否则,如果应用程序在过去使用了 “打开 ”或“ 另存为 ”对话框,则最近使用的路径将选择为初始目录。 但是,如果应用程序长时间未运行,则会丢弃其保存的选定路径。
- 如果 lpstrInitialDir 为 NULL ,并且当前目录包含指定筛选器类型的任何文件,则初始目录为当前目录。
- 否则,初始目录是当前用户的个人文件目录。
- 否则,初始目录为“桌面”文件夹。
lpstrTitle
类型: LPCTSTR
要放置在对话框标题栏中的字符串。 如果此成员为 NULL,则系统会使用默认游戏 (即 “另存为 ”或 “打开 ”) 。
Flags
类型:DWORD
一组可用于初始化对话框的位标志。 当对话框返回时,它将设置这些标志以指示用户的输入。 此成员可以是以下标志的组合。
Value含义
OFN_ALLOWMULTISELECT
0x00000200
“ 文件名 ”列表框允许多个选择。 如果还设置了 OFN_EXPLORER 标志,对话框将使用资源管理器样式的用户界面;否则,它使用旧式用户界面。
如果用户选择多个文件, lpstrFile 缓冲区将返回当前目录的路径,后跟所选文件的文件名。 nFileOffset 成员是第一个文件名的偏移量(以字节或字符为单位),不使用 nFileExtension 成员。 对于资源管理器样式的对话框,目录和文件名字符串以 NULL 分隔,最后一个文件名后面还有额外的 NULL 字符。 此格式使资源管理器样式的对话框能够返回包含空格的长文件名。 对于旧样式对话框,目录和文件名字符串用空格分隔,对于带空格的文件名,此函数使用短文件名。 可以使用 FindFirstFile 函数在长文件名和短文件名之间进行转换。
如果为旧样式对话框指定自定义模板, 则文件名 列表框的定义必须包含 LBS_EXTENDEDSEL 值。
OFN_CREATEPROMPT
0x00002000
如果用户指定不存在的文件,此标志将导致对话框提示用户创建文件的权限。 如果用户选择创建文件,则对话框将关闭,函数返回指定的名称;否则,对话框将保持打开状态。 如果将此标志与 OFN_ALLOWMULTISELECT 标志一起使用,则对话框允许用户仅指定一个不存在的文件。
OFN_DONTADDTORECENT
0x02000000
阻止系统在包含用户最近使用的文档的文件系统目录中添加指向所选文件的链接。 若要检索此目录的位置,请使用CSIDL_RECENT标志调用 SHGetSpecialFolderLocation 函数。
OFN_ENABLEHOOK
0x00000020
启用 lpfnHook 成员中指定的挂钩函数。
OFN_ENABLEINCLUDENOTIFY
0x00400000
使对话框在用户打开文件夹时 将CDN_INCLUDEITEM 通知消息发送到 OFNHookProc 挂钩过程。 该对话框为新打开的文件夹中的每个项目发送通知。 通过这些消息,您可以控制对话框在文件夹的项目列表中显示哪些项目。
OFN_ENABLESIZING
0x00800000
允许使用鼠标或键盘调整资源管理器样式对话框的大小。 默认情况下,“资源管理器”样式 的“打开 ”和“ 另存为 ”对话框允许调整对话框的大小,而不考虑是否设置了此标志。 仅当提供挂钩过程或自定义模板时,才需要此标志。 旧样式对话框不允许调整大小。
OFN_ENABLETEMPLATE
0x00000040
lpTemplateName 成员是指向由 hInstance 成员标识的模块中的对话模板资源名称的指针。 如果设置了 OFN_EXPLORER 标志,系统会使用指定的模板创建一个对话框,该对话框是默认资源管理器样式对话框的子级。 如果未设置 OFN_EXPLORER 标志,系统会使用模板创建替换默认对话框的旧样式对话框。
OFN_ENABLETEMPLATEHANDLE
0x00000080
hInstance 成员标识包含预加载对话框模板的数据块。 如果指定了此标志,系统将忽略 lpTemplateName 。 如果设置了 OFN_EXPLORER 标志,系统会使用指定的模板创建一个对话框,该对话框是默认资源管理器样式对话框的子级。 如果未设置 OFN_EXPLORER 标志,系统会使用模板创建替换默认对话框的旧样式对话框。
OFN_EXPLORER
0x00080000
指示对 “打开 ”或“ 另存为 ”对话框所做的任何自定义都使用资源管理器样式的自定义方法。 有关详细信息,请参阅 资源管理器样式挂钩过程 和 资源管理器样式自定义模板。
默认情况下, “打开 和 另存为 ”对话框使用资源管理器样式用户界面,而不考虑是否设置了此标志。 仅当提供挂钩过程或自定义模板或设置 OFN_ALLOWMULTISELECT 标志时,才需要此标志。
如果需要旧式用户界面,请省略 OFN_EXPLORER 标志并提供替换旧样式模板或挂钩过程。 如果想要旧样式,但不需要自定义模板或挂钩过程,只需提供始终返回 FALSE 的挂钩过程。
OFN_EXTENSIONDIFFERENT
0x00000400
用户键入的文件扩展名不同于 lpstrDefExt 指定的扩展名。 如果 lpstrDefExt 为 NULL,则该函数不使用此标志。
OFN_FILEMUSTEXIST
0x00001000
用户只能在 “文件名 ”条目字段中键入现有文件的名称。 如果指定了此标志,并且用户输入了无效名称,则对话框过程会在消息框中显示警告。 如果指定了此标志,则还会使用 OFN_PATHMUSTEXIST 标志。 此标志可在 “打开 ”对话框中使用。 它不能与 “另存为 ”对话框一起使用。
OFN_FORCESHOWHIDDEN
0x10000000
强制显示系统和隐藏文件,从而重写用户设置以显示或不显示隐藏文件。 但是,不会显示标记为系统和隐藏的文件。
OFN_HIDEREADONLY
0x00000004
隐藏 “只读 ”复选框。
OFN_LONGNAMES
0x00200000
对于旧式对话框,此标志会导致对话框使用长文件名。 如果未指定此标志,或者还设置了 OFN_ALLOWMULTISELECT 标志,则旧式对话框使用短文件名, (8.3 格式) 带空格的文件名。 资源管理器样式对话框忽略此标志,并始终显示长文件名。
OFN_NOCHANGEDIR
0x00000008
如果用户在搜索文件时更改了目录,则将当前目录还原为其原始值。
对于 GetOpenFileName,此标志无效。
OFN_NODEREFERENCELINKS
0x00100000
指示对话框返回所选快捷方式 (的路径和文件名。LNK) 文件。 如果未指定此值,对话框将返回快捷方式引用的文件的路径和文件名。
OFN_NOLONGNAMES
0x00040000
对于旧式对话框,此标志会导致对话框使用短文件名 (8.3 格式) 。 资源管理器样式对话框忽略此标志,并始终显示长文件名。
OFN_NONETWORKBUTTON
0x00020000
隐藏和禁用 “网络 ”按钮。
OFN_NOREADONLYRETURN
0x00008000
返回的文件未选中 “只读 ”复选框,并且不在受写保护的目录中。
OFN_NOTESTFILECREATE
0x00010000
在关闭对话框之前,不会创建该文件。 如果应用程序将文件保存在 create-nonmodify 网络共享上,则应指定此标志。 当应用程序指定此标志时,库不会检查写入保护、完整磁盘、打开的驱动器门或网络保护。 使用此标志的应用程序必须仔细执行文件操作,因为文件在关闭后无法重新打开。
OFN_NOVALIDATE
0x00000100
公共对话框允许返回的文件名中的无效字符。 通常,调用应用程序使用挂钩过程,该挂钩过程使用 FILEOKSTRING 消息检查文件名。 如果编辑控件中的文本框为空或不包含空格,则更新文件和目录的列表。 如果编辑控件中的文本框包含任何其他内容, 则 nFileOffset 和 nFileExtension 设置为通过分析文本生成的值。 不会向文本添加默认扩展,也不会将文本复制到 lpstrFileTitle 指定的缓冲区。 如果 nFileOffset 指定的值小于零,则文件名无效。 否则,文件名有效, nFileExtension 和 nFileOffset 可用作未指定 OFN_NOVALIDATE 标志。
OFN_OVERWRITEPROMPT
0x00000002
如果所选文件已存在,则会导致“ 另存为 ”对话框生成消息框。 用户必须确认是否覆盖文件。
OFN_PATHMUSTEXIST
0x00000800
用户只能键入有效的路径和文件名。 如果使用此标志,并且用户在 “文件名 ”条目字段中键入无效的路径和文件名,对话框函数会在消息框中显示警告。
OFN_READONLY
0x00000001
导致最初在创建对话框时选中 “只读 ”复选框。 此标志指示对话框关闭时“ 只读 ”复选框的状态。
OFN_SHAREAWARE
0x00004000
指定如果由于网络共享冲突而对 OpenFile 函数的调用失败,则忽略错误,并且对话框返回所选文件名。 如果未设置此标志,对话框会在用户指定的文件名发生网络共享冲突时通知挂钩过程。 如果设置 OFN_EXPLORER 标志,对话框会将 CDN_SHAREVIOLATION 消息发送到挂钩过程。 如果未 设置OFN_EXPLORER,对话框会将 SHAREVISTRING 已注册的消息发送到挂钩过程。
OFN_SHOWHELP
0x00000010
使对话框显示 “帮助 ”按钮。 hwndOwner 成员必须指定窗口才能接收当用户单击“帮助”按钮时对话框发送的 HELPMSGSTRING 注册消息。 当用户单击“帮助”按钮时,资源管理器样式对话框会向挂钩过程发送一条CDN_HELP通知消息。
nFileOffset
类型: WORD
从路径的开头到 由 lpstrFile 指向的字符串中文件名的从零开始的偏移量(以字符为单位)。 对于 ANSI 版本,这是字节数;对于 Unicode 版本,这是字符数。 例如,如果 lpstrFile 指向以下字符串“c:\dir1\dir2\file.ext”,则此成员包含值 13 以指示“file.ext”字符串的偏移量。 如果用户选择多个文件, 则 nFileOffset 是第一个文件名的偏移量。
nFileExtension
类型: WORD
从路径的开头到字符串中由 lpstrFile 指向的文件扩展名的从零开始的偏移量(以字符为单位)。 对于 ANSI 版本,这是字节数;对于 Unicode 版本,这是字符数。 通常文件扩展名是子字符串,紧跟点 (“的最后一个匹配项。) 字符。 例如,txt 是文件名readme.txt的扩展名,html 为readme.txt.html的扩展名。 因此,如果 lpstrFile 指向字符串“c:\dir1\dir2\readme.txt”,则此成员包含值 20。 如果 lpstrFile 指向字符串“c:\dir1\dir2\readme.txt.html”,则此成员包含值 24。 如果 lpstrFile 指向字符串“c:\dir1\dir2\readme.txt.html.”,则此成员包含值 29。 如果 lpstrFile 指向不包含任何“.”字符(如“c:\dir1\dir2\readme”)的字符串,则此成员包含零。
lpstrDefExt
类型: LPCTSTR
默认扩展。 如果用户无法键入扩展名,GetOpenFileName 和 GetSaveFileName 会将此扩展名追加到文件名。 此字符串可以是任何长度,但只追加前三个字符。 字符串不应包含句点 (.) 。 如果此成员为 NULL ,并且用户无法键入扩展,则不会追加任何扩展。
lCustData
类型: LPARAM
系统传递给 lpfnHook 成员标识的挂钩过程的应用程序定义数据。 当系统将 WM_INITDIALOG 消息发送到挂钩过程时,消息的 lParam 参数是指向创建对话框时指定的 OPENFILENAME 结构的指针。 挂钩过程可以使用此指针获取 lCustData 值。
lpfnHook
类型: LPOFNHOOKPROC
指向挂钩过程的指针。 除非 Flags 成员包含 OFN_ENABLEHOOK标志, 否则将忽略此成员。
如果未在 Flags 成员中设置OFN_EXPLORER标志,lpfnHook 是指向接收用于对话框的消息的 OFNHookProcOldStyle 挂钩过程的指针。 挂钩过程返回 FALSE 以将消息传递到默认对话框过程或 TRUE 以放弃该消息。
如果设置了 OFN_EXPLORER , lpfnHook 是指向 OFNHookProc 挂钩过程的指针。 挂钩过程接收从对话框发送的通知消息。 挂钩过程还会接收通过指定子对话模板定义的任何其他控件的消息。 挂钩过程不会接收用于默认对话框的标准控件的消息。
lpTemplateName
类型: LPCTSTR
hInstance 成员标识的模块中的对话框模板资源的名称。 对于编号对话框资源,可以是 MAKEINTRESOURCE 宏返回的值。 除非在 Flags 成员中设置OFN_ENABLETEMPLATE标志,否则将忽略此成员。 如果设置了 OFN_EXPLORER 标志,系统会使用指定的模板创建一个对话框,该对话框是默认资源管理器样式对话框的子级。 如果未设置 OFN_EXPLORER 标志,系统将使用模板创建替换默认对话框的旧样式对话框。
lpEditInfo
此成员使用
#ifdef _MAC
) 有条件地编译 (,以便它仅适用于 Motorola 68K Macintosh 计算机,不适用于 Windows 客户端操作系统。
lpstrPrompt
此成员使用
#ifdef _MAC
) 有条件地编译 (,以便它仅适用于 Motorola 68K Macintosh 计算机,不适用于 Windows 客户端操作系统。
pvReserved
类型: void*
此成员保留。
dwReserved
类型:DWORD
此成员保留。
FlagsEx
类型:DWORD
可用于初始化对话框的一组位标志。 目前,此成员可以为零或以下标志。
Value含义
OFN_EX_NOPLACESBAR
0x00000001
如果设置了此标志,则不显示位置栏。 如果未设置此标志,资源管理器样式对话框包含包含常用文件夹(如收藏夹和桌面)图标的位置栏。
注解
出于兼容性原因,如果 标志 设置为 OFN_ENABLEHOOK 且 lStructSize****OPENFILENAME_SIZE_VERSION_400,则隐藏。“位置”栏将
版权归原作者 哭哭啼 所有, 如有侵权,请联系我们删除。