C++ 创建类似Windows资源管理器的目录树

C++ 创建类似Windows资源管理器的目录树,c++,winapi,wxwidgets,windows-shell,C++,Winapi,Wxwidgets,Windows Shell,目前,我正在使用wxWidgets的wxGenericDirCtrl,它为我提供了目录树的用户界面。看起来是这样的: 但是,我希望它看起来像这样: 与wxWidgets开发人员交谈时,他们建议一个好的方法是修改wxGenericDirCtrl类以使用本机Windows目录控件。我想自己为wxWidgets贡献这个功能,但我不确定从哪里开始,我可以使用一些建议来开始 问题: 在C++中创建这种控件的正确的原生方式是什么?我是否使用MFC、.NET或其他工具 有什么关键字可以帮助我找到这些信息吗

目前,我正在使用wxWidgets的wxGenericDirCtrl,它为我提供了目录树的用户界面。看起来是这样的:

但是,我希望它看起来像这样:

与wxWidgets开发人员交谈时,他们建议一个好的方法是修改wxGenericDirCtrl类以使用本机Windows目录控件。我想自己为wxWidgets贡献这个功能,但我不确定从哪里开始,我可以使用一些建议来开始

问题:

在C++中创建这种控件的正确的原生方式是什么?我是否使用MFC、.NET或其他工具
  • 有什么关键字可以帮助我找到这些信息吗
  • 是否有任何示例代码显示如何执行此操作

  • wxWidgets不使用MFC、.NET或Windows上的任何其他高级库。只有基本的系统API(libs内核32、winspool、comctl32等)。OSX也是如此,使用操作系统提供的API。在Linux中没有这样的“基本API”,因此wxWidgets使用GTK+

    您已经有了要搜索的关键字:类似资源管理器的控件


    wxGenericDirCtrl
    具有
    GetTreeCtrl()
    成员。然后,只需将图像添加到节点,例如通过
    wxTreeCtrl::AssignButtonsImageList()
    。请参见

    自Windows Vista以来,创建类似Windows资源管理器的目录树(称为“shell命名空间树控件”)变得非常简单。可以通过名为的COM类创建此控件。Windows 7添加了该类的较新版本,名为

    可以从父窗口的
    WM_CREATE
    处理程序调用以下示例代码。它创建一个名称空间树控件,该控件的根设置为桌面文件夹。也可以使用其他根文件夹,甚至可以插入多个根

    #include <ShlObj.h>   //Shell COM API
    #include <atlbase.h>  //CComPtr
    
    static CComPtr<INameSpaceTreeControl> pTree;
    if( SUCCEEDED( pTree.CoCreateInstance( CLSID_NamespaceTreeControl ) ) )
    {
        RECT rc{ 0, 0, 444, 333 }; // Client coordinates of the tree control
        if( SUCCEEDED( pTree->Initialize( hWndParent, &rc, 
                NSTCS_HASEXPANDOS | NSTCS_AUTOHSCROLL | NSTCS_FADEINOUTEXPANDOS ) ) )
        {
            CComPtr<IShellItem> pItem;
            if( SUCCEEDED( SHCreateItemInKnownFolder( FOLDERID_Desktop, 0, nullptr, 
                                                      IID_PPV_ARGS( &pItem ) ) ) )
            {
                pTree->AppendRoot( pItem, SHCONTF_FOLDERS, NSTCRS_EXPANDED, nullptr );
            }
        }
    }
    

    不要忘记在程序启动时进行一次
    CoInitialize(nullptr)
    ,并在关机前进行
    CoUninitialize()

    我的问题不是修改wxGenericDirCtrl中的图标,而是在可能的情况下实际使用本机控件。你是说这在wxWidgets中是不可能的,唯一的方法是创建一个新控件,它看起来像Windows控件吗?我不知道有一个看起来像你想要的控件。我认为微软使用了一个带有自定义扩展按钮和图像的树状视图。这就是
    wxgenericdirectrl
    所做的。关于它是如何完成的,看看微软的USBView示例,这是一个很好的例子。MFC使用
    CMFCShellTreeCtrl
    ,它不是像
    TreeView
    那样的本机控件。我认为在wxwidgets中使用它是不实际的。您可以尝试使用WinAPI代替为什么不创建一个
    TreeView
    控件并实现所有必要的-用
    FindFirst
    等文件名填充。顺便说一句,第一个示例包括文件(.txt),Windows资源管理器树只有文件夹。
    pTree.Release();  // Releases the COM object and sets the pointer to nullptr