在 CFileDialog (MFC) 中设置文件夹视图

Posted

技术标签:

【中文标题】在 CFileDialog (MFC) 中设置文件夹视图【英文标题】:Setting the folder view in a CFileDialog (MFC) 【发布时间】:2011-10-25 08:02:35 【问题描述】:

是否有一种标准方法可以在 CFileDialog 中设置文件夹视图(启用 Vista 样式)?我正在尝试让它显示详细信息视图和一些自定义列。

我已经实现了一个 Windows 7 列处理程序,它显示由我的应用程序创建的文件的特定于应用程序的信息。但是,为了在资源管理器窗口或公用文件对话框中查看这些自定义列,我必须手动将文件夹视图设置为详细信息,然后选择我想要的特定列。

这很好用,但目标是让应用程序中的文件选择器自动在详细信息视图中显示这些列,除非用户更改视图样式。

我已经研究了各种方法来做到这一点,但没有找到可行的解决方案。 shell 属性包似乎存储了列类型和宽度以及视图样式,但其中大部分是二进制的,并且没有明显记录。如果我复制包属性,我可以切换视图设置,但这似乎很脆弱。

任何指针或其他帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我认为 Explorer 不会在 Vista/Windows 7 中加载列处理程序。

在 vista 文件对话框中更改视图设置:

Check OS version (needs Vista or higher)    
Not sure which event is raised on startup, OnFolderChange maybe?
assuming OnFolderChange is raised, override CFileDialog::OnFolderChange:
call GetIFileSaveDialog/GetIFileOpenDialog to get IFileDialog
//begin undocumented behavior 
QI for IServiceProvider from IFileDialog
QS for SID_SFolderView with IID_IFolderView2
call IFolderView2::SetViewModeAndIconSize
//end undocumented behavior
clean up COM interfaces

您也可以尝试未记录的方法 #2

//begin undocumented behavior 
QI for IServiceProvider from IFileDialog
QS for SID_STopLevelBrowser with IID_IShellBrowser
call IShellBrowser::QueryActiveShellView to get IShellView
QI IFolderView2 from IShellView
call IFolderView2::SetViewModeAndIconSize
//end undocumented behavior
clean up COM interfaces

【讨论】:

我称它为列处理程序,但它使用属性系统 COM 接口来处理显示自定义列和进入其中的数据。这在 Vista 和 7 中运行良好(在 XP 上,我需要实现之前的 IColumnProvider,但这是另一回事)。谢谢,我会调查这种方法。 我希望我有足够的业力来支持你。最终结果使用 IFileDialog -> IServiceProvider 中的 IFolderView2 将视图更改为详细信息模式。然后使用 IServiceProvider -> IShellBrowser -> IShellView 中的 IColumnManager 我能够使用我的自定义列的属性存储道具键设置列。非常感谢。

以上是关于在 CFileDialog (MFC) 中设置文件夹视图的主要内容,如果未能解决你的问题,请参考以下文章

MFC CFileDialog 只打开选择文件

MFC中CFileDialog使用方法

MFC中文件对话框类CFileDialog详解及文件过滤器说明

MFC CFileDialog 阻止打开 *.ext.other_ext 文件

MFC文件的读写操作,类的序列化与反序列化,CFile,CFileDialog,CArchive,CStdioFile

MFC CFileDialog窗口问题