C++ MFC,OPENFILENAME结构:m_of n.lpstrCustomFilter

C++ MFC,OPENFILENAME结构:m_of n.lpstrCustomFilter,c++,windows,c++11,mfc,C++,Windows,C++11,Mfc,我只是想弄清楚如何在MFC的CFileDialog中使用n.lpstrCustomFilter的m_ 内部结构是一个OPENFILENAME 我需要一个实用的示例,因为我找到的所有示例都将lpstrCustomFilter设置为NULL。根据文档: lpstrCustomFilter 类型:LPTSTR 一种静态缓冲区,包含一对以null结尾的筛选器字符串,用于保留用户选择的筛选器模式。第一个字符串是描述自定义过滤器的显示字符串,第二个字符串是用户选择的过滤器模式。应用程序第一次创建对话框时,指

我只是想弄清楚如何在MFC的
CFileDialog
中使用n.lpstrCustomFilter的
m_

内部结构是一个
OPENFILENAME

我需要一个实用的示例,因为我找到的所有示例都将
lpstrCustomFilter
设置为NULL。

根据文档:

lpstrCustomFilter
类型:LPTSTR
一种静态缓冲区,包含一对以null结尾的筛选器字符串,用于保留用户选择的筛选器模式。第一个字符串是描述自定义过滤器的显示字符串,第二个字符串是用户选择的过滤器模式。应用程序第一次创建对话框时,指定第一个字符串,可以是任何非空字符串。当用户选择文件时,对话框会将当前过滤器模式复制到第二个字符串。保留的过滤器模式可以是lpstrFilter缓冲区中指定的模式之一,也可以是用户键入的过滤器模式。下次创建对话框时,系统将使用这些字符串初始化用户定义的文件过滤器。如果nFilterIndex成员为零,则对话框将使用自定义筛选器

如果此成员为空,则对话框不会保留用户定义的筛选模式

如果此成员不是NULL,则nMaxCustFilter成员的值必须指定lpstrCustomFilter缓冲区的大小(以字符为单位)

nMaxCustFilter
类型:DWORD
lpstrCustomFilter标识的缓冲区大小(以字符为单位)。此缓冲区的长度应至少为40个字符。如果lpstrCustomFilterNULL或指向NULL字符串,则忽略此成员

例如:

TCHAR szfilter[256] = TEXT("custom filter\0*.ext\0");

...

m_ofn.lpstrCustomFilter = szFilter;
m_ofn.nMaxCustFilter = 256;
m_ofn.nFilterIndex = 0;
文档表明,当首次显示对话框且
nFilterIndex
为0时,由
lpstrCustomFilter
指定的初始筛选器处于活动状态,即使它与由
lpstrFilter
指定的筛选器不同。如果用户随后选择/输入不同的过滤器,
szfilter
将更新以包含用户选择的过滤器。这允许您保存
szFilter
,以便下次显示对话框时,如果需要,可以使用用户上次选择的过滤器初始化对话框

在实践中,这在XP和更早的版本中运行良好

在Windows 7(可能还有Vista)和更高版本中,
GetOpenFileName()
不再像这样运行,无论
OPENFILENAME
如何配置
GetOpenFileName()
只是忽略
lpstrCustomFilter
,从不应用初始自定义筛选器,也从不覆盖
szFilter
缓冲区。这意味着
lpstrCustomFilter
现在已弃用,不再使用,设置
nFilterIndex=0
将自动升级为
nFilterIndex=1
。这可能解释了为什么所有示例都将
lpstrCustomFilter
设置为
NULL

这种行为改变的原因是
GetOpenFileName()
已被弃用,它现在是向后兼容遗留代码的包装器
IFileOpenDialog
不支持保留用户指定的筛选器,它仅适用于应用程序定义的筛选器。较新的对话框中没有用于设置或检索用户指定筛选器的API,因此Microsoft显然没有让
GetOpenFileName()
包装器尝试在较新的对话框中模拟旧的
lpstrCustomFilter
功能


您可以尝试使用
lpstrFilter
手动模拟旧的
lpstrFilter
行为。为
自定义筛选器创建一个额外条目。如果用户以前选择过文件,则使用所选文件的扩展名初始化该条目,并将
nFilterIndex
设置为该条目基于1的索引。然后,当对话框关闭时,使用
lpstrFile
nFileExtension
提取用户实际选择的文件扩展名,并将其保存,以便您可以稍后初始化
自定义筛选器
条目。

您做了一个惊人的解释。非常感谢。