通用文件对话框(缩略图视图)






3.50/5 (5投票s)
2004年11月2日
2分钟阅读

82352

2454
一篇关于如何更改文件对话框初始视图的文章。
引言
市面上有很多带有图像预览的文件对话框。自从 Windows 2000 缩略图视图模式以来,它们都已过时。(我个人的看法)。但是如何让对话框默认设置为缩略图视图?或者说,任何其他视图呢?
背景
我发布这篇文章是因为我需要它。我搜索后找到的唯一信息是关于 VB 的。感谢 VBnet。所以这是我对 C++ 的采用。我使用了 WTL,但 MFC 或任何其他 C/C++ 都可以直接复制粘贴 FileDialogEx.H 中的代码。
使用代码
在 ATL/WTL 中,只需包含 FileDialogEx.H 并使用 CFileDialogEx
类,在以前使用 CFileDialog
类的地方。请注意,最后添加的参数是一个 enum
,它指定所需的初始列表视图。它默认为 SHVIEW_Default
,这意味着什么都不做,让 Windows 保持原样。在 MFC 和其他框架中,应该对 GetOpen
/SaveFileDialog
进行挂钩,并在挂钩例程中覆盖 WM_NOTIFY
消息。在那里,执行 CFileDialogEx::OnNotify
所做的事情。确保回链到默认处理,以免破坏文件对话框的功能。
// // Any Example of an open Handler //
LRESULT OnOpen(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { CMyFileDialog fileDlg( true , // TRUE for FileOpen, FALSE for FileSaveAs "*.*" , // LPCTSTR lpszDefExt = NULL, NULL , //,LPCTSTR lpszFileName = NULL, 0 , //dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Images\0*.bmp;*.dib;*.jpg;*.gif;*.png;*.ico\0" "All Files\0*.*",//LPCTSTR lpszFilter = NULL, m_hWnd , //HWND hWndParent = NULL SHVIEW_THUMBNAIL // which initial view ) ; fileDlg.DoModal() ; return 0 ; }
关注点
Windows 通用文件对话框代码对文件列表“SHELLDLL_DefView
”(OCX)进行了一些奇怪的操作。它会在文件对话框的生命周期内多次销毁和重建它。主要是,列表在 CDN_INITDONE
通知代码中不可用,而这正是自然的情况。这就是为什么代码会检查任何 WM_NOTIFY
是否存在列表,直到找到它,然后它就安息了。发送到列表的 WM_COMMAND
代码由 Spy++ 提取,是可能在 Windows 的未来版本中更改的魔术数字,我想。好吧,我希望 MS 监控 CodeProject 网站并保持它们不变。
最后,这篇文章和 Code-Project 上的之前的“文件对话框自定义” (Code-Project) 可以让用户对文件对话框拥有高度的控制权。所以下次我看到一个带有 64x64 图像预览并默认设置为图标视图的绘图程序时,我会对他们感到个人不满。现在他们没有好的借口了。