もし私がこれをしなければならなかったら、私はそれを後ろ向きに見るでしょう。
私はコントロールの中にstring
のメンバーとして入力されたテキストを保持していましたので、いつもコントロール内に実際に何が入力されているのかを知っています(のようなTextBox
のプロパティ)。
次に、TextRenderer.MeasureText()
メソッド(http://msdn.microsoft.com/en-us/library/7sy6awsb.aspx)を使用し、マウスのX座標を渡すまで、文字列の長さを繰り返し測定しますコントロール内では、右に次にいくつの文字が選択されているか知っています。
たとえば、ユーザーにコントロールのテキストHello
が書き込まれているとします。
そして、X座標その後、私は繰り返し、次の文字列にMeasureText()
を呼び出します右値20
のものであってもよいl
とo
、間ヒット:
H
:5つのピクセルの幅。
He
:幅10ピクセル。
Hel
:幅14ピクセル。
Hell
:幅17ピクセル。
Hello
:幅22ピクセル。
それから私は、マウスがl
とo
の間でヒットして知っているので、私は、テキストHell
を強調表示します。
不快例えば申し訳=)
UPDATE:
あなたはビットのバイナリ検索ツリー状に長さを計算することによって、これを最適化することができます。
電話帳で名前を検索するのと同じように、ページ単位で表示するのではなく、半分に分割して、これらの2つのページの間に確実に近づくようになります。
同様に、特にコントロールの長い文字列値の場合は、文字列全体の幅を計算し、次にその半分の長さを計算し、分割します。私はその時点でO(n log n)
と思う。あなたはBeemerGuyの素晴らしい提案の上に構築するために行うことができます。もちろん、
テキストは固定幅であれば、それはO(1)
だろう=)
読み取り専用の「TextBox」コントロールを使用できませんか?それはあなたのために仕事をするでしょう。 –
Textboxからこのコントロールを派生していますか? – Scottie
@Scottie - いいえ、UserControlからのみ継承します。 RichTextBoxとTextBoxは私が必要とするものではありません。自分の良いカスタムコントロールを構築する方法を知りたいのは本当に興味があります。 – climbage