Si je devais le faire, je regarderais en arrière.
Je garderais le texte entré comme un membre string
dans le contrôle, donc à tout moment je sais ce qui est réellement entré dans le contrôle (comme la propriété Text
dans un TextBox
).
Ensuite, je voudrais utiliser la méthode TextRenderer.MeasureText()
(http://msdn.microsoft.com/en-us/library/7sy6awsb.aspx) et je continuerais à mesurer la longueur de la chaîne à plusieurs reprises jusqu'à ce que je passe la coordonnée X de la souris dans le contrôle, à droite, je sais combien de caractères sont choisis. Par exemple, supposons que l'utilisateur ait écrit le texte Hello
dans le contrôle.
Et Coordonnée X frappé à droite entre le l
et le o
, ce qui pourrait être la valeur 20.
Alors j'appeler à plusieurs reprises MeasureText()
sur les chaînes suivantes:
H
: largeur de 5 pixels.
He
: largeur de 10 pixels.
Hel
: largeur de 14 pixels.
Hell
: largeur de 17 pixels.
Hello
: largeur de 22 pixels.
alors je sais que la souris a été frappé entre le l
et le o
, donc je puis mettre en évidence le texte Hell
.
Désolé pour l'exemple de mauvais goût =)
MISE À JOUR:
Vous pouvez optimiser ce un peu en calculant les longueurs de façon semblable recherche binaire arbre.
Tout comme si vous recherchiez un nom dans le répertoire, vous ne regardez pas page par page, mais vous le scindez en deux au fur et à mesure, vous vous rapprochez de plus en plus entre ces deux pages.
De même, en particulier pour les longues valeurs de chaîne du contrôle, calculez la largeur de la chaîne entière, puis la moitié de sa longueur, et divisez-la. Je pense que ce serait O(n log n)
à ce moment-là.
Bien sûr, il serait O(1)
si le texte est de largeur fixe =)
Cela fera le travail pour vous. –
Est-ce que vous dérivez ce contrôle de Textbox? – Scottie
@Scottie - Non, il hérite uniquement de UserControl. RichTextBox et TextBox ne sont pas tout à fait ce dont j'ai besoin, et je suis vraiment juste curieux d'apprendre comment construire mes propres bons contrôles personnalisés. – climbage