/********************************************************************
* GetOpenFileName 和 GetSaveFileName 函数使用例程
*
* 御风
* 2010.07.01
********************************************************************/
#include <windows.h>
#include <stdio.h>
int WINAPI WinMain(
HINSTANCE hInstance, // 当前实例的句柄
HINSTANCE hPrevInstance, // 上一个实例的句柄,这个是为了和 Win 3.1 兼容,在
Win32 的程序中此参数无用
LPSTR lpCmdLine, // 指向命令行字符串的指针
int nCmdShow // window 显示状态
)
{
FILE *fp;
OPENFILENAME ofn;
TCHAR szFile[MAX_PATH]="路径"; //路径缓冲区
TCHAR szTitle[MAX_PATH]="文件名"; //文件名缓冲区
static TCHAR szFilter[] = "文件类型\0*.*\0 文件类型 1\0*.*\0";
ofn.lStructSize = sizeof (OPENFILENAME) ;
ofn.hwndOwner = NULL ;
ofn.hInstance = NULL ;
ofn.lpstrFilter = szFilter ; //类型过滤
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0 ;
ofn.nFilterIndex = 0 ;
ofn.lpstrFile = szFile ; // 文件路径指针
ofn.nMaxFile = MAX_PATH ; //文件路径大小
ofn.lpstrFileTitle = szTitle ; //文件名指针
ofn.nMaxFileTitle = MAX_PATH ; //文件名大小
ofn.lpstrInitialDir = NULL; //初始化路径
ofn.lpstrTitle = "对话框标题" ; //对话框标题
ofn.Flags = OFN_ALLOWMULTISELECT|OFN_EXPLORER ; //位标记的设置
ofn.nFileOffset = 0 ;
ofn.nFileExtension = 0 ;
ofn.lpstrDefExt = TEXT ("txt") ; //默认扩展名
ofn.lCustData = 0L ;
ofn.lpfnHook = NULL ;
ofn.lpTemplateName = NULL ;
GetOpenFileName(&ofn);//打开文件窗口
GetSaveFileName(&ofn);//保存文件窗口
char a[]={nCmdShow+0x26,0};
MessageBox (NULL, ofn.lpstrFileTitle , TEXT ("HelloMsg"), 0);
fp=fopen(ofn.lpstrFile,"wb");
fwrite(ofn.lpstrFile,1,MAX_PATH,fp);
fclose(fp);
return 0 ;
}
OPENFILENAME
OPENFILENAME 结构包含了 GetOpenFileName 和 GetSaveFileName 函数用
来初始化打开或另存为对话框的信息。在用户关闭对话框后,系统返回关于用户的选择
信息到这个结构中。 结构体原型
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 // (_WIN32_WINNT >= 0x0500)
} OPENFILENAME, *LPOPENFILENAME;
成员
lStructSize
指定这个结构的大小,以字节为单位。 Windows 95/98 和 Windows NT 4.0:特意为 Windows 95/98 或 Windows NT 4.
0,及带有 WINVER 和_WIN32_WINNT >= 0x0500 编译时,为这个成员使用 OPENF
ILENAME_SIZE_VERSION_400。
Windows 2000 及更高版本:这个参数使用 sizeof (OPENFILENAME) 。
hwndOwner
指向所有者对话框窗口的句柄。这个成员可以是任意有效窗口句柄,或如果对话框
没有所有者它可以为 NULL。
hInstance
如果在 Flags 成员中设置了 OFN_ENABLETEMPLATEHANDLE 标记,hInstanc
e 成员指向包含一个对话框模板的内存对象。如果 OFN_ENABLETEMPLATE 标记被
设置,hInstance 是一个指向通过 lpTemplateName 成员命名的对话框模板的模块。如
果两者都没有被设置,这个成员被忽略。
如果 OFN_EXPLORER 标记被设置,系统使用 Explorer 风格的默认对话框的子窗
口作为指定模板来建立一个对话框。如果 OFN_EXPLORER 标记没有被设置,系统使
用模板建立一个旧风格的对话框。
lpstrFilter
指向一对以空字符结束的过滤字符串的一个缓冲。缓冲中的最后一个字符串必须以
两个 NULL 字符结束。
第一个字符串是过滤器描述的显示字符串(例如,“文本文件”),第二个字符指定
过滤样式(例如,“*.TXT”)。要为一个显示字符串指定多个过滤样式,使用分号(“;”)
分隔样式(例如,“*.TXT;*.DOC;*.BAK”)。一个样式字符串中可以包含有效的文件名
字字符及星号(*)通配符。不能在样式字符串中包含空格。
系统不能改变过滤器的次序。它按 lpstrFilter 指定的次序显示在文件类型组合框中。
如果 lpstrFilter 是 NULL,对话框不能显示任何过滤器。
lpstrCustomFilter
指向一个静态缓冲,它包含了一对以空字符结束的过滤器字符串,这个字符串是为
了保留用户选择的过滤样式。第一个字符串是描述定制过滤器的显示字符串,第二个字
符串是被用户选择的过滤器样式。第一次你的应用程序建立对话框,你指定
的第一个字
符串可以是任何非空的字符串。当用户选择了一个文件时,对话框复制当前过滤样式到
第二个字符串。保留过滤样式可以是在 lpstrFilter 缓冲中指定的样式之一,或是用户输
入的过滤器样式。在下一次对话框被建立时系统使用这个字符串去初始化用户自定义的
文件过滤器。如果 nFilterIndex 成员是 0,对话框使用定制过滤器。
如果这个成员是 NULL,对话框不能保留用户自定义过滤器样式。 如果这个成员不是 NULL,nMaxCustFilter 成员的值必须指定以 TCHARs 为单位
的 lpstrCustomFilter 缓冲的大小。对于 ANSI 版本,是字节的个数;对于 Unicode 版
本,是字符的个数。
nMaxCustFilter
指定特意为 lpstrCustomFilter 准备的以 TCHARs 为单位的缓冲大小。对于 ANSI
版本,是字节的个数;对于 Unicode 版本,是字符的个数。这缓冲应该最小在 40 个字
符长。如果 lpstrCustomFilter 成员是 NULL 或是指向 NULL 的字符串,这个成员被忽
略。
nFilterIndex
指定在文件类型控件中当前选择的过滤器的索引。缓冲指向被 lpstrFilter 包含的一
对定义了的过滤器的字符串。过滤器的第一对字符串的索引值为 1,第二对为 2,等等。
0 索引指出是通过 lpstrCustomFilter 指定的定制过滤器。你可以为对话框指定一个索
引作为最初的过滤器描述及过滤器样式。当用户选择了一个文件时,nFilterIndex 返回
当前显示的过滤器的索引。
如果 nFilterIndex 是 0 及 lpstrCustomFilter 是 NULL,系统使用在 lpstrFilter 缓冲
中的第一个过滤器。如果所有的三个成员都是 0 或 NULL,系统不使用任何过滤器,在
对话框的列表文件中不显示任何文件。
lpstrFile
指向包含初始化文件名编辑控件使用的文件名的缓冲。如果不需要初始值,这个缓
冲的第一个字符必须是 NULL。当 GetOpenFileName 或 GetSaveFileName 函数返回
成功时,这个缓冲包含驱动器,路径,文件名,及所选择的文件的扩展名。
如果 OFN_ALLOWMULTISELECT 标记被设置并且用户选择了多个文件,缓冲包
含了当前目录下被选择文件的文件名。对于 Explorer 风格对话框,目录和文件名字符
串是被 NULL 分开的,在文件名之后有一个额外的 NULL。对于旧风格对话框,字符串
fopen和open区别是被空格分开的并且函数为带有空格的文件名使用短文件名。你可以使用 FindFirstFile
函数在长短文件名之间转换。如果用户只选择了一个文件,lpstrFile 字符串在路径和文
件名之间没有分隔。
如果缓冲太小,函数返回 FALSE 并且 CommDlgExtendedError 函数返回 FNER
R_BUFFERTOOSMALL.。既然这样,lpstrFile 缓冲的首先两个字节包含必需的大小
(字节或字符)。
nMaxFile
指定 lpstrFile
缓冲的大小,以 TCHARs 为单位。对于 ANSI 版本,是字节的个数;
对于 Unicode 版本,是字符的个数。这个缓冲必须足够存储路径和文件名字符串,包含结尾的 null 字符。如果缓冲太小,GetOpenFileName 和 GetSaveFileName 函数返
回假(FALSE)缓冲最小应该在 256 个字符长。
lpstrFileTitle
指向接收选择的文件的文件名和扩展名的缓冲(不带路径信息)。这个成员可以是
NULL。
nMaxFileTitle
指定 lpstrFileTitle 缓冲的大小,以 TCHARs 为单位。对于 ANSI 版本,是字节的
个数;对于 Unicode 版本,是字节的个数。如果 lpstrFileTitle 是 NULL,这个成员被
忽略。
lpstrInitialDir
指向以空字符结束的字符串,可以在这个字符串中指定初始目录。Pointer to a nul
l terminated string that can specify the initial directory. 在不同的平台上,为选择初
始目录有不同的运算法则。
Windows 2000:
如果 lpstrFile 包含了一个路径,这个路径就是初始目录。
否则,lpstrInitialDir 指定的为初始目录。
如果 lpstrInitialDir 为 NULL,并且当前目录下包含有一些指定过滤器类型的文件,
初始目录就是当前目录。
否则,如果应用程序在过去使用过打开哐另存为对话框,使用最近选择的路径作为
初始目录。然而,如果一个应用程序长时间没有运行过,它保存的选择的路径将被丢弃。
否则,初始目录是当前用户的私人文件目录(即我的文档)。
否则,初始目录是桌面文件夹。
Windows 98:
lpstrInitialDir 指定初始目录。
如果 lpstrInitialDir 是 NULL 并且 lpstrFile 包含了一个路径,那么这个路径就是初
始目录。
否则,如果当前目录包含了一些指定的过滤类型的文件,那么初始化目录是当前目
录。
否则,初始目录是当前用户的私人文件目录(即我的文档)。
Windows 和 Windows NT/ 2000 的早期版本:
lpstrInitialDir 指定初始目录。
如果 lpstrInitialDir 是 NULL 并且 lpstrFile 包含了一个路径,那么这个路径就是初
始目录。
否则,初始目录是当前目录。 lpstrTitle
指向在对话框的标题栏中放置的字符串。如果这个成员是 NULL,系统使用默认标
题(另存为或打开)
Flags
位标记的设置,你可以使用来初始化对话框。当对话框返回时,它设置的这些标记
指出用户的输入。这个成员可以是下列标记的组合。 标记 含意
OFN_ALLOWMULTISELECT 指定文件名列表框允许多选。如果同时你设置了 O
FN_EXPLORER 标记,对话框使用 Explorer 风格用户界面;否则它使用旧风格用户界
面。
如果用户选择了一个以上的文件,lpstrFile 缓冲返回当前目录下所有被选择的文件
的文件名。nFileOffset 成员是到第一个文件名的偏移量(字节或字符),并且 nFileEx
tension 成员不被使用。对于 Explorer 风格对话框,目录和文件名是被 NULL 分隔的,
在最后的文件名后带有额外的 NULL。这个格式使 Explorer 风格的对话框能返回包含
空格的长文件名。对于旧风格对话框,目录和文件字符串是被空格分隔的,函数为带有
空格的文件名使用短文件名。你可以使用 FindFirstFile 函数在短文件名和长文件名之
间转换。
如果你为一个旧风格对话框指定了一个定制的模板,文件名列表框的定义必须包含
LBS_EXTENDEDSEL 值。
OFN_CREATEPROMPT 如果用户指定了一个不存在的文件,这个标记使用对话
框能提示用户是否新建这个文件。如果用户选择了新建这个文件,对话框关闭并且函数
返回指定的名字;否则,对话框继续停留。如果你使用带有 OFN_ALLOWMULTISEL
ECT 标记的这个标记,对话框允许用户去指定一个不存在的文件。
OFN_DONTADDTORECENT Windows 2000:防止系统为选择的文件增加快捷
链接到最近使用文档中。要回目录的位置,调用还有 CSIDL_RECENT 标记的 SHG
etSpecialFolderLocation 函数。
OFN_ENABLEHOOK 激活在 lpfnHook 成员中指定的钩子函数。
OFN_ENABLEINCLUDENOTIFY Windows 2000:当用户打开一个文件夹时,
引起对话框发送 CDN_INCLUDEITEM 通知消息到你的 OFNHookProc 程序。对话框
为在最近打开的文件夹中的每一个项目发送一个通知。这些消息使你能够控制那些在对
话框中显示的文件夹项目的列表。
OFN_ENABLESIZING Windows 2000,Windows 98:使 Explorer 风格的对话
框可以使用鼠标或键盘调整大小。缺省时,Explorer 风格的打开和另存为对话框允许
被调整大小,不顾这个标记是否被设置。这标记仅在你提供了一个钩子程序或定制模板
时是必需的。旧风格的对话框不允许调整大小。
OFN_ENABLETEMPLATE 指出 lpTemplateName 成员是指向对话框模板资源的
名字,这个模板资源在能被 hInstance 成员识别的模块中。 如果 OFN_EXPLORER 标记被设置,系统使用指定的模板去建立一个对话框,是
默认 Explorer 风格对话框的子窗口。如果 OFN_EXPLORER 标记没有被设置,系统使
用旧风格的对话框替代默认的对话框。
OFN_ENABLETEMPLATEHANDLE 指出 hInstance 成员能识别的包含预载对话
框模板的数据块。如果这个标记被指定的,系统忽略 lpTemplateName。
如果 OFN_EXPLORER 标记被设置,系统使用指定的模板去建立一个对话框,是
默认 Explorer 风格对话框的子窗口。如果 OFN_EXPLORER 标记没有被设置,系统使
用模板去建立一个旧风格对话框替代默认对话框。
OFN_EXPLORER 指出任何打开
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论