• 选择文件夹


    介绍 正如我在另一篇文章“CIconDialog -选择图标”中提到的,在开发一个向导应用程序时,我需要一个从可执行文件中选择图标的对话框和另一个用于在多个文件中选择文件夹的对话框,但是在MFC中没有找到任何关于它的内容。因此,CFolderDialog被编写了出来。它封装了::SHBrowseForFolder API。 示例使用 CFolderDialog派生自CCommonDialog,其行为类似于任何普通对话框。看到示例用法:隐藏,复制Code

    //...
    #ifndef __FOLDERDLG_H__
        #include "FolderDlg.h"
    #endif
    // ...
    void CSomeDialog::OnSomeHandler( void ) 
    { 
        m_strFolderPath = _T( "d:\Windows" ); // Just for sample    
        m_strDisplayName.Empty();
        
        CFolderDialog dlg(  _T( "Dialog Title" ), m_strFolderPath, this );
        if( dlg.DoModal() == IDOK  )
        {    
            m_strFolderPath  = dlg.GetFolderPath();
            m_strDisplayName = dlg.GetFolderDisplayName();
            // Use folder path and display name here ...
        }    
    }
    //

    看到演示项目来源。 设置根文件夹 您还可以设置对话框的根文件夹,指定开始浏览的根文件夹的位置。在名称空间层次结构中,只有指定的文件夹和它下面的任何子文件夹将出现在对话框中。 看到示例用法:隐藏,复制Code

    //...
    #ifndef __FOLDERDLG_H__
        #include "FolderDlg.h"
    #endif
    // ...
    void CSomeDialog::OnSomeHandler( void ) 
    {
        CFolderDialog dlg( _T( "Root folder is C:" ), NULL, this );
        dlg.SetRootFolder( _T( "C:\" );
        
        if( dlg.DoModal() == IDOK  )
        {       
            // ...
        }
    }
    //

    感谢Eckhard Schwabe和Jose Insa提供的样本。 自定义筛选 在Microsoft®Windows®XP/2003或更高版本下,您可以对对话框的内容进行自定义过滤。 要创建一个自定义过滤器,请遵循以下步骤: 在CFolderDialog构造函数的uFlags成员中设置BIF_NEWDIALOGSTYLE标志。重写派生类中的唯一未知虚拟成员函数。在OnIUnknown上,函数的pIUnknown参数将包含一个指向IUnknown实例的指针。在IUnknown上调用QueryInterface来获得一个指向IFolderFilterSite的指针。 创建一个实现IFolderFilter的对象——从中派生一个类,该类实现IUnknown的所有基本的纯虚拟成员函数,并实现IFolderFilterSite::ShouldShow和IFolderFilterSite::GetEnumFlags函数,它们执行过滤。 调用IFolderFilterSite::SetFilter(在步骤1中获得的指针),给它传递一个指向自定义IFolderFilter派生类的指针。然后可以使用IFolderFilterSite::ShouldShow和IFolderFilterSite::GetEnumFlags方法来包含和排除树中的项。 一旦创建了过滤器,就不再需要IFolderFilterSite接口了。如果你不再使用它,调用IFolderFilterSite::Release。 我添加了一个示例自定义过滤(看图片,对话框中只显示“JPG/GIF/BMP”文件)。感谢Arik Poznanski撰写的文章“c#实现Shell,第1部分”。有关更多信息,请参阅源代码。 类成员 基类 CCommonDialog 数据成员 m_bi - Windows的浏览器结构。提供对基本文件夹对话框参数的访问。 包含对话框中所选文件夹的路径。 包含对话框打开时最初选择的文件夹路径。 建设 构造一个CFolderDialog对象:隐藏复制Code

    CFolderDialog( IN LPCTSTR pszTitle = NULL, IN LPCTSTR pszSelPath = 
          NULL, IN CWnd* pWndParent = NULL, IN UINT uFlags = BIF_RETURNONLYFSDIRS )

    显示在对话框顶部的标题。 pszSelPath—对话框打开时最初要选择的文件夹路径。 pWndParent -指向文件对话框对象的父窗口或所有者窗口的指针。 uFlags -一个或多个标志的组合,允许您自定义对话框。有关更多信息,请参见平台SDK中的BROWSEINFO结构。 操作 DoModal(void)显示“浏览文件夹”对话框,并允许用户进行选择。 SetSelectedFolder(在LPCTSTR pszPath中)——设置对话框打开时最初选择的文件夹路径。 SetRootFolder(在LPCTSTR pszPath中)——设置要显示的根文件夹路径。如果pszPath为空,则删除根文件夹。 GetRootFolder(输出LPTSTR pszPath)——获取对话框的根文件夹。pszPath缓冲区的大小必须至少为MAX_PATH字符。 GetSelectedFolder(void) const——获取对话框打开时最初选择的文件夹路径。 GetFolderPath(void)常量—检索打开的文件夹的路径。 GetFolderDisplayName(void)常量—检索当前打开的文件夹的显示名称。 获取与所选文件夹相关联的图像。该映像被指定为系统映像列表的索引。 GetBI(void)—检索CFolderDialog对象的BROWSEINFO结构。 GetBI(void)常量——检索CFolderDialog对象的BROWSEINFO结构。 重写的 OnInitialized(void)——在浏览对话框完成初始化时调用。 OnSelChanged(在LPITEMIDLIST pItemIDList中)-当浏览对话框选择被更改时调用。 OnValidateFailed(在LPCTSTR pszPath中)——当用户在浏览对话框的编辑框(如果有的话)中键入无效名称时调用。返回零允许取消对话框,返回非零保持对话框打开。 Microsoft®Windows®XP/2003或更高版本: 使用IFolderFilterSite和IFolderFilter为客户端提供一个IUnknown接口,用于定制对话框内容的过滤。 函数,只有在重写时才有效调用: EnableOK(在BOOL bEnable = TRUE中)-启用或禁用浏览对话框的OK按钮。 SetSelection(在-选择指定的文件夹。 SetSelection(在LPCTSTR pszPath中)——选择指定的文件夹。 SetStatusText(在LPCTSTR pszText中)——设置对话框状态文本。 Shell版本5.0或更高版本: setexpand(在LPITEMIDLIST pItemIDList中)-指定要在对话框中展开的路径。 setexpand(在LPCTSTR pszPath中)——指定要在对话框中展开的路径。 设置对话框“OK”按钮的文本。 笔记 如果您将此项目转换为vc7.0或更高版本,不要忘记添加shlwapi.dll到延迟加载dll列表中,因为它使用了shlwapi.dll 5.0的::StrRetToStr函数。打开“[项目属性]>[配置属性]>[链接器]>[输入]”,并将“shlwapi.dll;”添加到“[延迟加载dll]”列表中。vc6.0项目使用“/DelayLoad”链接器选项,不支持vc7.0或更高版本。 版本历史 2002年3月27日 发表这篇文章。 2003年3月30 一些代码更改。 增加了旧平台SDK中缺少的新标志定义。 增加了对MFC 6.0和7.0的支持。 为Microsoft®Windows®XP文件夹过滤增加了OnIUnknown处理程序。 添加setexpand, SetOKText和GetSelectedFolder函数。 2003年5月30日 添加了OnSelChanged默认实现。 2003年7月14日 为Microsoft®Windows®XP/2003或更高版本添加了自定义过滤样本。 setsetexpand和SetOKText到noinline。 2004年1月07 增加了SetRootFolder和GetRootFolder功能。 改变IFolderFilter实现。 2005年2月15日 多亏了WindSeven,修复了DoModal中的小bug。 本文转载于:http://www.diyabc.com/frontweb/news4979.html

  • 相关阅读:
    https authorization basic
    第二十一章 单例模式
    第十九章 组合模式
    第十八章 备忘录模式
    第十七章 适配器模式
    第十六章 状态模式
    新博客~
    CF922D Robot Vacuum Cleaner
    BZOJ1767 [CEOI2009]harbingers
    树的直径学习笔记
  • 原文地址:https://www.cnblogs.com/Dincat/p/13462114.html
Copyright © 2020-2023  润新知