知识严重贫瘠~

公共对话框—— OPENFILENAME结构

上一篇 / 下一篇  2010-06-17 14:13:15 / 个人分类:C++

    今天学习了怎么修改open这个对话框的Title,需求是把默认的Open改成Add,由于本人是开发菜鸟,所以无奈的上网查了相关的文档。
    首先找到了这个类CFileDialog Class,然后查看其成员,其中有一个m_fon的结构体:
    m_ofn is a structure of type OPENFILENAME. The data in this structure represents the current state of the CFileDialog.

    然后重点看了OPENFILENAME这个结构体:
The OPENFILENAME structure contains information that the GetOpenFileName and GetSaveFileName functions use to initialize an Open or Save As dialog box. After the user closes the dialog box, the system returns information about the user's selection in this structure.

其中有一个成员
lpstrTitle
指向在对话框的标题栏中放置的字符串。如果这个成员是NULL,系统使用默认标题(另存为或打开)


所以只要我们定义了这个成员的值,就可以达到修改打开对话框的Title的目的。



附上这个结构体的介绍:

OPENFILENAME

OPENFILENAME结构包含了GetOpenFileNameGetSaveFileName函 数用来初始化打开或另存为对话框的信息。在用户关闭对话框后,系统返回关于用户的选择信息到这个结构中。

typedef struct tagOFN {
DWORDlStructSize;
HWNDhwndOwner;
HINSTANCEhInstance;
LPCTSTRlpstrFilter;
LPTSTRlpstrCustomFilter;
DWORDnMaxCustFilter;
DWORDnFilterIndex;
LPTSTRlpstrFile;
DWORDnMaxFile;
LPTSTRlpstrFileTitle;
DWORDnMaxFileTitle;
LPCTSTRlpstrInitialDir;
LPCTSTRlpstrTitle;
DWORDFlags;
WORDnFileOffset;
WORDnFileExtension;
LPCTSTRlpstrDefExt;
LPARAMlCustData;
LPOFNHOOKPROClpfnHook;
LPCTSTRlpTemplateName;
#if (_WIN32_WINNT >= 0x0500)
void *pvReserved;
DWORDdwReserved;
DWORDFlagsEx;
#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编译时,为这个成员使用OPENFILENAME_SIZE_VERSION_400。

Windows 2000及更高版本这个参数使用sizeof (OPENFILENAME) 。

hwndOwner
指向所有者对话框窗口的句柄。这个成员可以是任意有效窗口句柄,或如果对话框没有所有者它可以为NULL。
hInstance
如果在Flags成员中设置了OFN_ENABLETEMPLATEHANDLE标记,hInstance成 员指向包含一个对话框模板的内存对象。如果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。当GetOpenFileNameGetSaveFileName函 数返回成功时,这个缓冲包含驱动器,路径,文件名,及所选择的文件的扩展名。

如果OFN_ALLOWMULTISELECT标记被设置并且用户选择了多个文件,缓冲包含了当前目录下被选择文件的文件名。对于Explorer 风格对话框,目录和文件名字符串是被NULL分开的,在文件名之后有一个额外的NULL。对于旧风格对话框,字符串是被空格分开的并且函数为带有空格的文 件名使用短文件名。你可以使用FindFirstFile函 数在长短文件名之间转换。如果用户只选择了一个文件,lpstrFile字符串在路径和文件名之间没有分隔。

如果缓冲太小,函数返回FALSE并且CommDlgExtendedError函 数返回FNERR_BUFFERTOOSMALL.。既然这样,lpstrFile缓冲的首先两个字节包含必需的大小(字节或字符)。

nMaxFile
指定lpstrFile缓冲的大小,以TCHARs为单位。对于ANSI版本,是字节的个数;对于 Unicode版本,是字符的个数。这个缓冲必须足够存储路径和文件名字符串,包含结尾的null字符。如果缓冲太小,GetOpenFileNameGetSaveFileName函 数返回假(FALSE)缓冲最小应该在256个字符长。
lpstrFileTitle
指向接收选择的文件的文件名和扩展名的缓冲(不带路径信息)。这个成员可以是NULL。
nMaxFileTitle
指定lpstrFileTitle缓冲的大小,以TCHARs为单位。对于ANSI版本,是字节的个数; 对于Unicode版本,是字节的个数。如果lpstrFileTitle是NULL,这个成员被忽略。
lpstrInitialDir
指向以空字符结束的字符串,可以在这个字符串中指定初始目录。Pointer to a null terminated string that can specify the initial directory. 在不同的平台上,为选择初始目录有不同的运算法则。

Windows 2000:

  1. 如果lpstrFile包含了一个路径,这个路径就是初始目录。
  2. 否则,lpstrInitialDir指定的为初始目录。
  3. 如果lpstrInitialDir为NULL,并且当前目录下包含有一些指定过滤器类型的文件,初始目录就是当前目 录。
  4. 否则,如果应用程序在过去使用过打开哐另存为对话框,使用最近选择的路径作为初始目录。然而,如果一个应用程序长时间没有运行过,它保 存的选择的路径将被丢弃。
  5. 否则,初始目录是当前用户的私人文件目录(即我的文档)。
  6. 否则,初始目录是桌面文件夹。

Windows 98:

  1. lpstrInitialDir指定初始目录。
  2. 如果lpstrInitialDir是NULL并且lpstrFile包含了一个路径,那么这个路径就是 初始目录。
  3. 否则,如果当前目录包含了一些指定的过滤类型的文件,那么初始化目录是当前目录。
  4. 否则,初始目录是当前用户的私人文件目录(即我的文档)。

Windows和Windows NT/ 2000的早期版本:

  1. lpstrInitialDir指定初始目录。
  2. 如果lpstrInitialDir是NULL并且lpstrFile包含了一个路径,那么这个路径就是 初始目录。
  3. 否则,初始目录是当前目录。
lpstrTitle
指向在对话框的标题栏中放置的字符串。如果这个成员是NULL,系统使用默认标题(另存为或打开)
Flags
位标记的设置,你可以使用来初始化对话框。当对话框返回时,它设置的这些标记指出用户的输入。这个成员可以是下列标记的组合。
标记含意
OFN_ALLOWMULTISELECT指定文件名列表框允许多选。如果同时你设置了OFN_EXPLORER标记,对话框使用Explorer风格用户界面; 否则它使用旧风格用户界面。

如果用户选择了一个以上的文件,lpstrFile缓冲返回当前目录下所有被选择的文件的文件名。nFileOffset成 员是到第一个文件名的偏移量(字节或字符),并且nFileExtension成员不被使用。对于Explorer风格对话框,目录和文件 名是被NULL分隔的,在最后的文件名后带有额外的NULL。这个格式使Explorer风格的对话框能返回包含空格的长文件名。对于旧风格对话框,目录 和文件字符串是被空格分隔的,函数为带有空格的文件名使用短文件名。你可以使用FindFirstFile函数在短文件名和长文件名之间 转换。

如果你为一个旧风格对话框指定了一个定制的模板,文件名列表框的定义必须包含LBS_EXTENDEDSEL值。

OFN_CREATEPROMPT如果用户指定了一个不存在的文件,这个标记使用对话框能提示用户是否新建这个文件。如果用户选择了新建这个文件,对话框 关闭并且函数返回指定的名字;否则,对话框继续停留。如果你使用带有OFN_ALLOWMULTISELECT标记的这个标记,对话框允许用户去指定一个 不存在的文件。
OFN_DONTADDTORECENTWindows 2000:防止系统为选择的文件增加快捷链接到最近使用文档中。要找回目录的位置,调用 还有CSIDL_RECENT标记的SHGetSpecialFolderLocation函 数。
OFN_ENABLEHOOK激活在lpfnHook成员中指定的钩子函数。
OFN_ENABLEINCLUDENOTIFYWindows 2000:当用户打开一个文件夹时,引起对话框发送CDN_INCLUDEITEM通 知消息到你的OFNHookProc程 序。对话框为在最近打开的文件夹中的每一个项目发送一个通知。这些消息使你能够控制那些在对话框中显示的文件夹项目的列表。
OFN_ENABLESIZINGWindows 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指出任何打开或另存为对话框使用新的Explorer风格的用户化模块。关于更多的信息,参见Explorer-Style. Hook ProceduresExplorer-Style. Custom Templates

缺省下,打开和另存为对话框使用Explorer风格用户界面,不顾这个标记是否设置。这个标记仅在你提供了一个钩子程序或定制模板或设置了 OFN_ALLOWMULTISELECT标记时是必需的。

如果你想使用旧风格的界面,省略OFN_EXPLORER 标记,并且提供一个代替的旧风格模板或钩子程序。如果你想用旧风格但不需要一个定制模板或钩子程序,简单的提供一个钩子程序,让它返回FALSE。

OFN_EXTENSIONDIFFERENT指定用户输入的一个文件的扩展名与lpstrDefExt指定的扩展名不同。如果lpstrDefExt是 NULL,函数不使用这个标记。
OFN_FILEMUSTEXIST指定用户仅可以在文件名登录字段中输入已存在的文件的名字。如果这个标记被指定的并且用户输入了一个无效的名字,对话框 程序显示一个等待消息框。如果这个标记被指定,OFN_PATHMUSTEXIST标记也被使用。
OFN_FORCESHOWHIDDENWindows 2000:强制显示系统和隐藏属性的文件,从而压倒用户设置的显示或不显示隐藏文件。否 则,带有系统和隐藏标记的文件不被显示。
OFN_HIDEREADONLY隐藏只读复选框。
OFN_LONGNAMES对于旧风格对话框,这个标记引起对话框使用长文件名。如果这个标记没有被指定,或如果 OFN_ALLOWMULTISELECT标记也被设置,旧风格对话框为带有空格的文件名使用短文件名(8.3格式)。

Explorer风格对话框忽略这个标记,通常显示长文件名。

OFN_NOCHANGEDIR如果当搜索文件时用户改变了目录的时候,恢复当前目录到它的初始值。
OFN_NODEREFERENCELINKS引导对话框为选择的快捷方式(.LNK)文件返回路径和文件名。如果这个值没有被指定,对话框返回这个快捷方式所引用文 件的路径和文件名。
OFN_NOLONGNAMES对于旧风格对话框,这个标识引起对话框去使用短文件名(8.3格式)。

Explorer风格对话框忽略这个标记,通常显示长文件名。

OFN_NONETWORKBUTTON隐藏和显示风格按钮。
OFN_NOREADONLYRETURN指定返回的文件不带有只读复选框,不是在写保护的目录中。
OFN_NOTESTFILECREATE指定文件不是在对话框关闭前建立的。如果应用程序保存文件到一个建立的非映象风格共享上,这个标记应该被指定的。当一个 应用程序指定了这标记,库不能检查写保护,磁盘满,打开驱动器门或网络保护。应用程序使用这个标记必须小心执行文件操作,因为一旦文件被关闭,它不能重新 打开。
OFN_NOVALIDATE指定公共对话框允许在返回的文件名中有无效的字符。典型的,正在调用的程序使用一个钩子程序通过FILEOKSTRING消 息检查文件名。如果在编辑控件中的文本框是空的或只包含了空格,那么文件和目录列表框是被更新的。如果编辑控件中的文本框包含了别的东西,那么nFileOffset 和nFileExtension的设置值是通过分析文本产生的。没有默认的扩展名被添加到文本,也没有文本被复制到lpstrFileTitle指 定的缓冲。

如果通过nFileOffset指定的值比0小,文件是无效的。否则,文件名是有效的。如果OFN_NOVALIDATE没有被指 定,nFileExtensionnFileOffset可以被使用。

OFN_OVERWRITEPROMPT如果选择的文件已经存在,使用另存为对话框产生一个消息框。用户必须确认是否复盖这个文件。
OFN_PATHMUSTEXIST指定用户仅能输入的路径和文件名。如果这个标记被使用并且用户在文件名输入字段中键入了一个用效的路径和文件名,对话框 函数显示一个等待消息。
OFN_READONLY当对话框建立时,显示被选择的只读复选框。这个标记指出当对话框被关闭时只读复选框的状态。
OFN_SHAREAWARE指出如果调用OpenFile函 数因为网络共享冲突而失败,这个错误被忽略并且对话框返回选择的文件名。

如果这个标记没有被设置,当用户选择的文件名发生网络共享冲突时,对话框发送通知到你的钩子程序。如果你设置了OFN_EXPLORER标记,对话 框发送CDN_SHAREVIOLATION消 息到钩子程序。如果你没有设置OFN_EXPLORER,对话框发送SHAREVISTRING注 册的消息到钩子程序。

OFN_SHOWHELP使对话框显示帮助按钮。hwndOwner成员必须指定一个窗口,这个窗口作为接收对话框发送的HELPMSGSTRING注 册的消息,当用户单击帮助按钮时对话框发送这个消息。

当用户单击帮助按钮时,一个Explorer风格的对话框发送CDN_HELP通 知消息到你的钩子程序。


nFileOffset
指定从路径开始到通过lpstrFile指定的文件名字符串基于0的偏移,以TCHARs为单位。对于 ANSI版本,是字节的个数;对于Unicode版本,是字符的个数。例如,如果lpstrFile指向下列的字符串,“c:\dir1 \dir2\file.ext”,这个成员包含指出“file.ext”字符串偏移的位置值13。

如果用户选择了多于一个的文件,nFileOffset是到第一个文件名的偏移。

nFileExtension
指定从路径开始到通过lpstrFile指定的文件名字符串中扩展名基于0的偏移,以TCHARs为单 位。对于ANSI版本,是字节的个数;对于Unicode版本,是字节的个数。例如,如果lpstrFile指向下列的字符 串,“c:\dir1\dir2\file.ext”,这个成员包含的值是18。如果用户没有输入一个扩展名并且lpstrDefExt是 NULL,这个成员指定的偏移是结束字符NULL。如果用户在文件名中输入一个“.”作为最后的字符,这个成员是0。
lpstrDefExt
指向包含默认扩展名的缓冲。如果用户忘记输入扩展名,GetOpenFileNameGetSaveFileName附 加这个扩展名到文件名中。这个字符串可以是任一长度,但但只有头三个字符被附加。字符串不应该包含一个句点(.)。如果这个成员是NULL并且用户忘记了 输入一个扩展名,那么将没有扩展名被附加。
lCustData
指定应用程序定义的数据,这数据是能被lpfnHook成员识别的系统传到的钩子程序。当系统发送WM_INITDIALOG消 息到程序,消息的lParam参数指向当对话框建立时指定的OPENFILENAME结构。钩子程序可以使用这个指针获得lCustData的 值。
lpfnHook
指向一个钩子程序。除非Flags成员中包含OFN_ENABLEHOOK标记,要么这个成员将被忽略。

如果在Flags成员中OFN_EXPLORER标记没有被设置,lpfnHook指向一个OFNHookProcOldStyle钩 子程序,这个程序有意的从对话框接收消息。钩子程序返回FALSE传递一个消息到默认的对话框程序或返回TRUE丢弃消息。

如果OFN_EXPLORER被设置,lpfnHook指向一个OFNHookProc钩 子程序。这个钩子程序接收从对话框发出的通知消息。这个钩子程序也接收你通过一个子对话框模板定义的附加控件的消息。钩子程序不有意接收默认对话框的标准 控件的消息。

lpTemplateName
指向一个以空字符结束的字符串,字符串是对话框模板资源的名字,资源保存在能被hInstance成员识别的模块中。对 于有限的对话框资源,这可以是通过MAKEINTRESOURCE返 回的值。除非在Flags成员中设置了OFN_ENABLETEMPLATE标记,要么这个成员被忽略。

如果OFN_EXPLORER标记被设置,系统使用指定的模板去建立一个对话框,是默认Explorer风格对话框的子窗口。如果 OFN_EXPLORER标记没有被设置,系统使用模板去建立一个旧风格的对话框来替代默认对话框。

pvReserved
保留。
dwReserved
保留。
FlagsEx
Windows 2000:设置位标记,你可以使用来初始化对话框。这个成员可以是下列标记的组合。
标记含意
OFN_EX_NOPLACESBAR如果这个标记被设置,则位置栏被不显示。如果这个标记没有设置,则Explorer风格的对话框包含一般使用文件图标的 位置栏,例如像收藏夹和桌面。


另外一篇转自http://zhangyonggameres.blog.163.com/blog/static/134734903201018101631242/的博文:
初学GetOpenFileName()函数的时候,当时一看OPENFILENAME的成员有那么多,像我这样的新手大概都吓了一跳,怎么这么难啊,随 后老大又说,我们先复制用着先,以后再搞明白,“以后再搞明白”当然就是“不用搞明白”啦。随后一直拖到今天,都还是没搞明白。

           怎么把它搞明白呢?首先就要把它化简。那么多成员,不用每个都赋值吧。试一下先,先声明一下:OPENFILENAME ofn;发现如果所有成员都不赋值的话,调用GetOpenFileName()时,并没有对话框弹出来。

         想起当时老大说过,GetOpenFileName()要确定调用它的是什么版本的windows,而GetOpenFileName()是通过确定 OPENFILENAME这个结构体的大小来确定windows的版本的。所以ofn.lStructSize=sizeof(OPENFILENAME);  或 ofn.lStructSize=sizeof(ofn);   是必须的;

         再试试,怎么还是不行???再想想,原来我还没有把ofn清零就给ofn的成员赋值了,当然就不行啦;所以ZeroMemory(&ofn.sizeof(ofn));也 是必须的啦;试试,成功啦!!!所以最简单的GetOpenFileName(),只须填两个成员就OK了;

  但 是,既然用了GetOpenFileName(),就是想用它来get  filename嘛。不把filename[MAX_PATH],的指针传给 ofn.lpstrFile,又怎么拿到路径呢?肯定要加句
ofn.lpstrFile=filename;   的 啦!

         但是,加完这句ofn.lpstrFile=filename;却发现,原来 可以的对话框,现在又弹不出来了!怎么会这样呢?噢,要先zeromemory(filename,MAX_PATH);         恩,这次应该行了吧。    结果却还是不行?怎么这样???

        苦苦思索后,终于去了百度,答案,没有直接找到。但在那一堆成员介绍中,看到一个nMaxFile.      难道传了指针给结构体之后,必须再传一个字符串最大位数给结构体???于是ofn.nMaxFile=MAX_PATH;      OK!终于,成功了。

         当然,上面讲的只是最简单的GetOpenFileName();其他的过滤器,打开多个文件,打开文件夹(而不是文件),等功能,以后用到了,再百度 一下就好了

TAG: OPENFILENAME

 

评分:0

我来说两句

日历

« 2024-04-27  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 15605
  • 日志数: 11
  • 建立时间: 2010-05-31
  • 更新时间: 2010-07-22

RSS订阅

Open Toolbar