C++ MFC,OPENFILENAME结构:m_of n.lpstrCustomFilter
我只是想弄清楚如何在MFC的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结尾的筛选器字符串,用于保留用户选择的筛选器模式。第一个字符串是描述自定义过滤器的显示字符串,第二个字符串是用户选择的过滤器模式。应用程序第一次创建对话框时,指
CFileDialog
中使用n.lpstrCustomFilter的m_
内部结构是一个OPENFILENAME
我需要一个实用的示例,因为我找到的所有示例都将lpstrCustomFilter
设置为NULL。根据文档:
lpstrCustomFilter
类型:LPTSTR
一种静态缓冲区,包含一对以null结尾的筛选器字符串,用于保留用户选择的筛选器模式。第一个字符串是描述自定义过滤器的显示字符串,第二个字符串是用户选择的过滤器模式。应用程序第一次创建对话框时,指定第一个字符串,可以是任何非空字符串。当用户选择文件时,对话框会将当前过滤器模式复制到第二个字符串。保留的过滤器模式可以是lpstrFilter缓冲区中指定的模式之一,也可以是用户键入的过滤器模式。下次创建对话框时,系统将使用这些字符串初始化用户定义的文件过滤器。如果nFilterIndex成员为零,则对话框将使用自定义筛选器
如果此成员为空,则对话框不会保留用户定义的筛选模式
如果此成员不是NULL,则nMaxCustFilter成员的值必须指定lpstrCustomFilter缓冲区的大小(以字符为单位)
nMaxCustFilter
类型:DWORD
由lpstrCustomFilter标识的缓冲区大小(以字符为单位)。此缓冲区的长度应至少为40个字符。如果lpstrCustomFilter为NULL或指向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
提取用户实际选择的文件扩展名,并将其保存,以便您可以稍后初始化自定义筛选器
条目。您做了一个惊人的解释。非常感谢。