ツリービュー コントロールは、ラベルを検索するための API を提供しません。アイテムを手動でトラバースし、それらを文字列と比較する必要があります。
ツリービューが 1 レベル以上の深さである場合は、アイテムをトラバースする方法 (深さ優先または幅優先) を決定する必要があります。同じラベルのアイテムが複数ある場合、これらの戦略は異なるアイテムを返す可能性があります。
実装は次のようになります。
// 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 );
}