2010-11-23 9 views
3

私はC#(WPFではなく)でカスタムコントロールを構築していますが、基本的にはマウスでテキスト強調を実装したいと思っています。与えられた点でユーザが描いた文字列内の文字を見つける

文字列内の特定のPoint(マウスがクリックされた場所など)の文字を効率的に見つけるにはどうすればよいですか?私は描画された文字列のレイアウトの矩形を持っており、私はマウスがクリックされた場所に最も近いものを見つけるまで、文字列の長さを計算することができます...しかし、より良い方法があります。助言がありますか?

+0

読み取り専用の「TextBox」コントロールを使用できませんか?それはあなたのために仕事をするでしょう。 –

+0

Textboxからこのコントロールを派生していますか? – Scottie

+0

@Scottie - いいえ、UserControlからのみ継承します。 RichTextBoxとTextBoxは私が必要とするものではありません。自分の良いカスタムコントロールを構築する方法を知りたいのは本当に興味があります。 – climbage

答えて

3

もし私がこれをしなければならなかったら、私はそれを後ろ向きに見るでしょう。
私はコントロールの中にstringのメンバーとして入力されたテキストを保持していましたので、いつもコントロール内に実際に何が入力されているのかを知っています(のようなTextBoxのプロパティ)。
次に、TextRenderer.MeasureText()メソッド(http://msdn.microsoft.com/en-us/library/7sy6awsb.aspx)を使用し、マウスのX座標を渡すまで、文字列の長さを繰り返し測定しますコントロール内では、右に次にいくつの文字が選択されているか知っています。

たとえば、ユーザーにコントロールのテキストHelloが書き込まれているとします。
そして、X座標その後、私は繰り返し、次の文字列にMeasureText()を呼び出します右値20
のものであってもよいlo、間ヒット:

  • H:5つのピクセルの幅。
  • He:幅10ピクセル。
  • Hel:幅14ピクセル。
  • Hell:幅17ピクセル。
  • Hello:幅22ピクセル。

それから私は、マウスがloの間でヒットして知っているので、私は、テキストHellを強調表示します。

不快例えば申し訳=)

UPDATE:
あなたはビットのバイナリ検索ツリー状に長さを計算することによって、これを最適化することができます。
電話帳で名前を検索するのと同じように、ページ単位で表示するのではなく、半分に分割して、これらの2つのページの間に確実に近づくようになります。
同様に、特にコントロールの長い文字列値の場合は、文字列全体の幅を計算し、次にその半分の長さを計算し、分割します。私はその時点でO(n log n)と思う。あなたはBeemerGuyの素晴らしい提案の上に構築するために行うことができます。もちろん、
テキストは固定幅であれば、それはO(1)だろう=)

+0

それは私が今やっていることです。私はより効率的な方法を見つけることができない場合、私はちょうどこのソリューションを維持する必要があります。 – climbage

+0

ああ、テキストは複数の行を折り返すことができます。 – climbage

+0

@climbage;それは少し難しいでしょう。まず、Y座標をその行を始める文字のインデックスに変換し、上の同じロジックに従います。 – BeemerGuy

2

もう一つは、オフセットの配列を事前計算することです。文字列が変更されると(ユーザータイプまたはプロパティがコードで設定されている)、オフセット配列を再計算できます。これにより、マウスクリック時にMeasureFontへの呼び出しが節約され、文字が簡単に見つかります。基本的には、最も近い文字を見つけるまで配列を繰り返します。オフセットは暗黙的に値でソートされているので、バイナリ検索を使用してより効果的にすることさえできます。

+0

私はそれが好きです。索引付けに似ています。これは、特にリアルタイムインタラクティビティについて話しているときに、最適化するための良い方法です。迅速な対応が必須です! – BeemerGuy

+0

唯一の問題は、テキストの折り返しがいつでも変更できるため、文字のオフセットが変更される場合があります。 – climbage

+0

@climbage;実際にはこれは複数行の場合に理想的です。各行の始めにオフセットを作成し、Yを配列の行番号に変換して、それを私の答えのロジックと組み合わせるだけです。 – BeemerGuy

関連する問題