树视图控件不提供用于搜索标签的 API。您将不得不手动遍历这些项目并将它们与您的字符串进行比较。
如果树视图的深度超过一层,则必须决定如何遍历项目(深度优先或广度优先)。如果有多个具有相同标签的项目,这些策略可能会返回不同的项目。
一个实现可能看起来像这样:
// Helper function to return the label of a treeview item
std::wstring GetItemText( HWND hwndTV, HTREEITEM htItem )
{
static const size_t maxLen = 128;
WCHAR buffer[ maxLen + 1 ];
TVITEMW tvi = { 0 };
tvi.hItem = htItem; // Treeview item to query
tvi.mask = TVIF_TEXT; // Request text only
tvi.cchTextMax = maxLen;
tvi.pszText = &buffer[ 0 ];
if ( TreeView_GetItem( hwndTV, &tvi ) )
{
return std::wstring( tvi.pszText );
}
else
{
return std::wstring();
}
}
这是实际遍历发生的地方。递归调用该函数,直到无法搜索更多项目或找到匹配项。此实现使用区分大小写的比较 ( wstring::operator==( const wstring& )
)。如果您需要不同的谓词,则必须根据需要修改实现。
HTREEITEM FindItemDepthFirstImpl( HWND hwndTV, HTREEITEM htStart, const std::wstring& itemText )
{
HTREEITEM htItemMatch = NULL;
HTREEITEM htItemCurrent = htStart;
// Iterate over items until there are no more items or we found a match
while ( htItemCurrent != NULL && htItemMatch == NULL )
{
if ( GetItemText( hwndTV, htItemCurrent ) == itemText )
{
htItemMatch = htItemCurrent;
}
else
{
// Traverse into child items
htItemMatch = FindItemDepthFirstImpl( hwndTV, TreeView_GetChild( hwndTV, htItemCurrent ), itemText );
}
htItemCurrent = TreeView_GetNextSibling( hwndTV, htItemCurrent );
}
return htItemMatch;
}
以下函数包装递归并将根元素作为起点。这是您将在代码中调用的函数。HTREEITEM
如果找到,它将返回一个,NULL
否则。
HTREEITEM FindItem( HWND hwndTV, const std::wstring& itemText )
{
HTREEITEM htiRoot = TreeView_GetRoot( hwndTV );
return FindItemDepthFirstImpl( hwndTV, htiRoot, itemText );
}