2010-10-05 4 views
4

В элементе управления WinForms TextBox, как я могу получить в экранных координатах ограничивающий прямоугольник текста как заданное положение символа? Я знаю индекс начала и конца индекса, о котором идет речь, но учитывая эти два значения, как я могу найти ограничительную рамку этого текста?Как получить ограничительную рамку текста на экране в C#?

Чтобы быть ясным ... Я знаю, как получить ограничительную коробку самого элемента управления. Мне нужна ограничивающая рамка подстроки TextBox.Text.

ответ

1

Я играл с Graphics.MeasureString, но не смог получить точные результаты. Следующий код дает мне довольно последовательные результаты при разных размерах шрифтов с Graphics.MeasureCharacterRanges.

private Rectangle GetTextBounds(TextBox textBox, int startPosition, int length) 
{ 
    using (Graphics g = textBox.CreateGraphics()) 
    { 
    g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 

    CharacterRange[] characterRanges = { new CharacterRange(startPosition, length) }; 
    StringFormat stringFormat = new StringFormat(StringFormat.GenericTypographic); 
    stringFormat.SetMeasurableCharacterRanges(characterRanges); 

    Region region = g.MeasureCharacterRanges(textBox.Text, textBox.Font, 
              textBox.Bounds, stringFormat)[0]; 
    Rectangle bounds = Rectangle.Round(region.GetBounds(g)); 

    Point textOffset = textBox.GetPositionFromCharIndex(0); 

    return new Rectangle(textBox.Margin.Left + bounds.Left + textOffset.X, 
         textBox.Margin.Top + textBox.Location.Y + textOffset.Y, 
         bounds.Width, bounds.Height); 
    } 
} 

Этот фрагмент просто помещает панель поверх моего TextBox, чтобы проиллюстрировать вычисленный прямоугольник.

... 
Rectangle r = GetTextBounds(textBox1, 2, 10); 
Panel panel = new Panel 
{ 
    Bounds = r, 
    BorderStyle = BorderStyle.FixedSingle, 
}; 

this.Controls.Add(panel); 
panel.Show(); 
panel.BringToFront(); 
... 
+0

Wow Matt ... это здорово. Благодаря!! – Damion

0

Возможно, вы можете использовать Graphics.MeasureString. Вы можете получить графический объект для формы с помощью метода CreateGraphics. Скажем, вы должны найти ограничительную рамку для «World» в «Hello World». Итак, сначала измеряем строку «Hello», которая даст вам ширину «Hello», которая, в свою очередь, скажет вам левую позицию. Затем измерьте фактическое слово, чтобы получить правильное положение.

Смежные вопросы