WTL 扩展文件对话框






4.40/5 (5投票s)
2002年3月27日
2分钟阅读

81419

1031
如何扩展 WTL 的 CFileDialog,添加 Windows ME、2000 和 XP 的功能
引言
WTL 包含一个 CFileDialog
类,几乎与 MFC 中提供的类相同。正如任何使用过这两个类的人都知道的那样,这些类都没有 Windows 2000 和 XP 通用文件对话框左侧的“位置”栏。
启用此位置栏所需的更改非常小,传递给 GetOpenFileName
或 GetSaveFileName
的 OPENFILENAME
结构基本上需要替换为更大的 OPENFILENAMEEX
结构。该结构具有一个 FlagsEx
成员,需要将其设置为 0 以启用位置栏。
较早版本的 Windows 对新结构的支持不好,因此我们需要确保仅在 Windows 2000、XP 或 ME 正在使用时才使用此结构。为此,我们检查如果使用的是 NT,则版本是否至少为 5,如果使用的是 9x 操作系统,则版本是否至少为 4.90。
您可以下载我的 CSSFileDialog
类,它以一个简单的 CFileDialogImpl
实现中实现了这些想法,从此页面的顶部下载。该类重写了 DoModal 方法,并略微更改了代码以填充 OPENFILENAMEEX
结构(成员 m_ofnex
)。它只是将所有数据从 m_ofn
成员(这是一个 OPENFILENAME
)复制过来,然后填充额外的成员。在调用 GetOpenFileName
或其对应项之后,m_ofnex
的相关部分会复制回 m_ofn
。
我还重新实现了 MFC 中使用管道字符 '|' 作为筛选器分隔符,而不是使用 NULL 字符。可以通过构造函数的最后一个参数(指定 false)来禁用此功能。CSSFileDialog
的构造函数如下所示
CSSFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, HWND hWndParent = NULL, bool bUsePipeChar = true)
因此,要显示通用文件打开对话框,现在可以这样做
CSSFileDialog dlgOpen(TRUE, NULL, NULL, OFN_HIDEREADONLY, "All Files (*.*)|*.*", m_hWnd);
如果想要禁用位置栏,只需将 m_bShowPlacesBar
成员设置为 false 即可。
我希望有人觉得这有用!我一直使用 MFC 的等效实现(我自己编写的),并且似乎没有任何问题。我只是想要一个现代文件对话框的轻量级实现,但找不到任何地方,所以我就编写了一个。