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

Roc*_*net 3 c++ winapi wxwidgets windows-shell

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

wxGenericDirCtrl

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

Windows 资源管理器目录树

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

问题:

  1. 在 C++ 中创建此类控件的正确本机方法是什么?我使用 MFC、.NET 还是其他语言?
  2. 有没有关键字可以帮助我找到这些信息?
  3. 有任何示例代码显示如何执行此操作吗?

zet*_*t42 6

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

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 );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Release()当父窗口被销毁时,通过调用 COM 对象的方法来销毁命名空间树控件,通常在WM_DESTROY父窗口的处理程序中:

pTree.Release();  // Releases the COM object and sets the pointer to nullptr
Run Code Online (Sandbox Code Playgroud)

不要忘记CoInitialize(nullptr)在程序启动时和CoUninitialize()关闭之前执行一次。