65.9K
CodeProject 正在变化。 阅读更多。
Home

WTL 扩展文件对话框

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.40/5 (5投票s)

2002年3月27日

2分钟阅读

viewsIcon

81419

downloadIcon

1031

如何扩展 WTL 的 CFileDialog,添加 Windows ME、2000 和 XP 的功能

CSSFileDialog

引言

WTL 包含一个 CFileDialog 类,几乎与 MFC 中提供的类相同。正如任何使用过这两个类的人都知道的那样,这些类都没有 Windows 2000 和 XP 通用文件对话框左侧的“位置”栏。

启用此位置栏所需的更改非常小,传递给 GetOpenFileNameGetSaveFileNameOPENFILENAME 结构基本上需要替换为更大的 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 的等效实现(我自己编写的),并且似乎没有任何问题。我只是想要一个现代文件对话框的轻量级实现,但找不到任何地方,所以我就编写了一个。

© . All rights reserved.