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; Text* pLine; while ( it != itEnd ) { pLine = *it; ++it; iChars += pLine->Length(); if ( p.y < pLine->Y() ) { continue; } if ( p.y > pLine->Bottom() ) { continue; } if ( p.y < pLine->Bottom()) break; } iChars -= pLine->Length(); int iLinePos = pLine->GetClosestCharacter( Gwen::Point( p.x - pLine->X(), p.y - pLine->Y() ) ); 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; }