int Text::GetClosestCharacter( Gwen::Point p ) { if ( !m_Lines.empty() ) { TextLines::iterator it = m_Lines.begin(); TextLines::iterator itEnd = m_Lines.end(); int iChars = 0; while ( it != itEnd ) { Text* pLine = *it; ++it; iChars += pLine->Length(); if ( p.y < pLine->Y() ) continue; if ( p.y > pLine->Bottom() ) continue; iChars -= pLine->Length(); int iLinePos = pLine->GetClosestCharacter( Gwen::Point( p.x - pLine->X(), p.y - pLine->Y() ) ); //if ( iLinePos > 0 && iLinePos == pLine->Length() ) iLinePos--; iLinePos--; return iChars + iLinePos; } } int iDistance = 4096; int iChar = 0; for ( size_t i=0; i<m_String.GetUnicode().length()+1; i++ ) { Gwen::Rect cp = GetCharacterPosition( i ); int iDist = abs(cp.x - p.x) + abs(cp.y - p.y); // this isn't proper if ( iDist > iDistance ) continue; iDistance = iDist; iChar = i; } return iChar; }