gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:06 29 4
gpt4 key购买 nike

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

wxGenericDirCtrl

不过,我希望它看起来像这样:

Windows Explorer directory tree

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

问题:

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

最佳答案

自 Windows Vista 以来,创建类似于目录树的 Window Explorer(称为“shell 命名空间树控件”)变得非常容易。此控件可以通过名为 INameSpaceTreeControl 的 COM 类创建. 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 );
}
}
}

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

pTree.Release();  // Releases the COM object and sets the pointer to nullptr

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

关于c++ - 创建类似目录树的 Windows 资源管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48586051/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com