Wenn ich das tun müsste, würde ich es rückwärts betrachten.
Ich würde den Text als string
Mitglied in der Steuerung eingegeben, so weiß ich jederzeit, was tatsächlich in das Steuerelement eingegeben wird (wie die Eigenschaft in einem TextBox
).
Dann würde ich die TextRenderer.MeasureText()
Methode verwenden (http://msdn.microsoft.com/en-us/library/7sy6awsb.aspx) und ich würde die Länge der Zeichenfolge wiederholt messen, bis ich die X-Koordinate der Maus übergeben innerhalb der Kontrolle, genau dann weiß ich, wie viele Zeichen gewählt werden.
Angenommen, der Benutzer hat den Text Hello
in das Steuerelement geschrieben.
Und die X-Koordinate traf direkt zwischen dem l
und dem o
, die dann von Wert 20.
könnte ich immer wieder auf die folgenden Zeichenfolgen aufrufen würde MeasureText()
:
H
: Breite von 5 Pixel.
He
: Breite von 10 Pixel.
Hel
: Breite von 14 Pixel.
Hell
: Breite von 17 Pixel.
Hello
: Breite von 22 Pixel.
Dann weiß ich die Maus zwischen den l
und den o
getroffen wurde, so würde ich dann markieren Sie den Text Hell
.
Sorry für das geschmacklos Beispiel =)
UPDATE:
Sie können durch die Berechnung der Längen in einer binary-search-baumartigen Art und Weise dies ein wenig optimieren.
Genau wie Sie einen Namen im Telefonbuch nachschlagen würden, sehen Sie nicht Seite für Seite, sondern eher in zwei Hälften geteilt, je näher Sie kommen, bis es definitiv zwischen diesen beiden Seiten liegt.
In ähnlicher Weise, insbesondere für lange String-Werte des Steuerelements, berechnen Sie die Breite des gesamten Strings, dann die Hälfte seiner Länge, und teilen Sie es dort. Ich denke, das wäre an diesem Punkt O(n log n)
.
Natürlich wäre es O(1)
, wenn der Text mit fester Breite ist =)
Können Sie ein schreibgeschütztes 'TextBox'-Steuerelement nicht verwenden? Das wird die Arbeit für dich erledigen. –
Beziehen Sie dieses Steuerelement von Textbox? – Scottie
@Scottie - Nein, erbt nur von UserControl. RichTextBox und TextBox sind nicht ganz das, was ich brauche, und ich bin wirklich nur neugierig, wie ich meine eigenen guten benutzerdefinierten Steuerelemente erstellen kann. – climbage