2017-07-25 4 views
1

RichTextBoxに特定の文字列の開始位置を取得するためにGetPositionFromCharIndex()を使用していたところがありました。他の要件のために、私はいくつかの単語のフォントサイズを増やすために変更を加えました。単語が拡大してしまうと(そして、同じ位置の文字列が同じままであれば)、私が測定している文字列は押し下げられますが、Y位置は何らかの理由で同じものとして読み込まれます。同じ行の大きなテキストのために、RichTextBoxでシフトダウンされるテキストの位置を取得するにはどうすればよいですか?

私はこれを確認するためのクイックテストアプリを作成し、それを複製することができます。以下は、私が使用しているすべてのコードです(もちろんデザイナーは別です)。

public Form1() 
{ 
    InitializeComponent(); 

    richTextBox1.Text = "Test statement"; 

    //Select "Test" and increase the size 
    richTextBox1.SelectionStart = richTextBox1.Text.IndexOf("Test"); 
    richTextBox1.SelectionLength = 4; 
    richTextBox1.SelectionFont = new Font(richTextBox1.Font.FontFamily, 16); 

    Point test = richTextBox1.GetPositionFromCharIndex(richTextBox1.Text.IndexOf("Test")); 
    Point statement = richTextBox1.GetPositionFromCharIndex(richTextBox1.Text.IndexOf("statement")); 

    //"statement" is pushed down due to "Test" being enlarged, 
    //Yet the Y value is the same for both words 
    label1.Text = $"Test location: {test.X},{test.Y}"; 
    label2.Text = $"statement location: {statement.X},{statement.Y}"; 
} 

と結果のスクリーンショット:
String position measure results

これは、私は周りを取得できるものですか?明らかに「ステートメント」という単語はであり、実際にはのY値は同じではありません。 RichTextBoxのように思えますが、その言葉はその高さから始まりますので、それを測るだけですが、そうであれば私には明らかな解決策はないようです。

+1

あなたは一歩踏み出し、達成しようとしている問題点を説明できますか? – mjwills

+0

@mjwills - 特定の単語の境界を記録し、ホバーイベントでそれらの境界をチェックします。カーソルがその範囲を超えている場合、その単語をクリック可能にしたい(別名、カーソルを手に変更する)。だから私の例では、 "ステートメント"はクリック可能な単語にする必要があります、私はそれを上に移動し、まだ手を得る場合はちょっと面白いように見えます。 –

答えて

1

GetPositionFromCharIndexは、as designedです。

ドキュメントの状態:

この方法は、あなたがコントロール内の特定の 文字インデックスがどこにあるかを決定することができます。このメソッドは、ショートカットメニュー項目を表示する や、 コントロールの単語のヘルプ情報などのタスクに使用できます。たとえば、コントロール内の単語をユーザーが右クリックしたときにユーザーが のオプションメニューを表示する場合は、 このメソッドを使用して、単語の位置を正しく決定することができます。 ContextMenuコントロールを表示します。

は、両方の単語が同じY値を返すようにするために、それは理にかなっている、ことを考える - その(あなたが期待するので、両方の単語のために一貫して行動し、右クリックして、右 声明単語の少し上をクリックしても、それ期待どおりに動作する可能性があります)。

+0

Whelp ....私はいつもフォントサイズを測定し、それに基づいて私のYを変えようとしますね... –

関連する問題