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

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (5投票s)

2004年11月2日

2分钟阅读

viewsIcon

82352

downloadIcon

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 图像预览并默认设置为图标视图的绘图程序时,我会对他们感到个人不满。现在他们没有好的借口了。

CodeProject 中的缩略图视图通用文件对话框 - 代码之家
© . All rights reserved.