2010-08-16 5 views
0

J'ai créé une boîte de dialogue de recherche non modale pour la recherche dans un RichTextBox et je n'arrive pas à positionner la boîte de dialogue de recherche après la sélection du texte trouvé afin qu'il ne couvre pas le texte sélectionné. J'ai essayé d'obtenir le numéro de ligne par rapport à la zone client en utilisant les éléments suivants:Comment positionner une boîte de dialogue de recherche pour ne pas couvrir le texte trouvé?

this.lineCount = this.rtb.Height/(this.rtb.Font.Height+2); 

rtb.Select(rtbIndex, searchText.Length); 

int linePos = (this.rtb.GetLineFromCharIndex(this.rtb.GetFirstCharIndexOfCurrentLine())) % this.lineCount; 

if(linePos<(this.lineCount/2)) 
{ 
    this.Location = rtb.PointToScreen(new Point(rtb.Bounds.Left, rtb.Bounds.Bottom - this.Height)); 
} 
else 
{ 
    this.Location = rtb.PointToScreen(new Point(rtb.Bounds.Left, rtb.Bounds.Top)); 
} 

this.lineCount est le nombre de lignes qui correspondent dans la zone client en fonction de la hauteur de la police et la hauteur du richtextbox. C'est une valeur précise que j'ai vérifiée. Mon code positionne la boîte de dialogue de recherche en bas de la zone richtext si lineNum est inférieur à la moitié de la valeur de this.lineCount, sinon en haut

Cependant, linePos n'est pas fiable. Il a parfois une valeur de zéro lorsque la ligne avec le texte sélectionné est la 19ème ligne et le lineCount est 20, donc le dialogue est déplacé sur le texte sélectionné. Ainsi, il ne calcule pas de façon fiable où la zone richtext affiche le texte sélectionné.

+0

Vous avez de bonnes réponses, mais ne fermez pas votre fil. Quelque chose d'autre dont tu as besoin? –

Répondre

1

Vous n'avez pas besoin de calculer la position de caractère vous-même, vous pouvez l'obtenir en utilisant la méthode GetPositionFromCharIndex

+0

mais cela ne permet pas de positionner le dialogue de sorte qu'il ne couvre pas le texte sélectionné car il donne la position absolue depuis le début du texte dans le RTB, pas par rapport au texte affiché, ce dont j'ai besoin. –

+0

@bill, je ne suis pas sûr de ce qui se passe de votre côté. 'GetPositionFromCharIndex' renvoie des coordonnées relatives au coin supérieur gauche du RTB, quelle que soit la position de défilement. (J'ai revérifié en créant un projet VS 2010 WinForms ciblé pour .Net 2.0, fonctionnant sous Win7.) –

Questions connexes