Search text in labels
// FindItem - Finds an item that contains the search string // Returns - Handle to the item or NULL // str - String to search for // bCaseSensitive - Should the search be case sensitive // bDownDir - Search direction - TRUE for down // bWholeWord - True if search should match whole words // hItem - Item to start searching from. NULL for // - currently selected item HTREEITEM CTreeCtrlX::FindItem(CString &str, BOOL bCaseSensitive /*= FALSE*/, BOOL bDownDir /*= TRUE*/, BOOL bWholeWord /*= FALSE*/, HTREEITEM hItem /*= NULL*/) { int lenSearchStr = str.GetLength(); if( lenSearchStr == 0 ) return NULL; HTREEITEM htiSel = hItem ? hItem : GetSelectedItem(); HTREEITEM htiCur = bDownDir ? GetNextItem( htiSel ) : GetPrevItem( htiSel ); CString sSearch = str; if( htiCur == NULL ) { if( bDownDir ) htiCur = GetRootItem(); else htiCur = GetLastItem( NULL ); } if( !bCaseSensitive ) sSearch.MakeLower(); while( htiCur && htiCur != htiSel ) { CString sItemText = GetItemText( htiCur ); if( !bCaseSensitive ) sItemText.MakeLower(); int n; while( (n = sItemText.Find( sSearch )) != -1 ) { // Search string found if( bWholeWord ) { // Check preceding char if( n != 0 ) { if( isalpha(sItemText[n-1]) || sItemText[n-1] == '_' ){ // Not whole word sItemText = sItemText.Right( sItemText.GetLength() - n - lenSearchStr ); continue; } } // Check succeeding char if( sItemText.GetLength() > n + lenSearchStr && ( isalpha(sItemText[n+lenSearchStr]) || sItemText[n+lenSearchStr] == '_' ) ) { // Not whole word sItemText = sItemText.Right( sItemText.GetLength() - n - sSearch.GetLength() ); continue; } } if( IsFindValid( htiCur ) ) return htiCur; else break; } htiCur = bDownDir ? GetNextItem( htiCur ) : GetPrevItem( htiCur ); if( htiCur == NULL ) { if( bDownDir ) htiCur = GetRootItem(); else htiCur = GetLastItem( NULL ); } } return NULL; } // IsFindValid - Virtual function used by FindItem to allow this // function to filter the result of FindItem // Returns - True if item matches the criteria // Arg - Handle of the item BOOL CTreeCtrlX::IsFindValid( HTREEITEM ) { return TRUE; }In the class declaration add the following.
public: virtual HTREEITEM FindItem(CString &sSearch, BOOL bCaseSensitive = FALSE, BOOL bDownDir = TRUE, BOOL bWholeWord = FALSE, HTREEITEM hItem = NULL); protected: virtual BOOL IsFindValid( HTREEITEM );
IT Offers
More for Developers
Top Authors
- Voted: 13 times.
- Voted: 11 times.
- Voted: 11 times.
- Voted: 8 times.
- Voted: 8 times.
- Paul Kimmel 214 articles
- Zafir Anjum 120 articles
- Tom Archer - MSFT 83 articles
- Jeffrey Juday 79 articles
- Mark Strawmyer 78 articles