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