Как получить ограничительную рамку текста на экране в C #? - PullRequest
4 голосов
/ 05 октября 2010

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

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

Ответы [ 2 ]

2 голосов
/ 05 октября 2010

Я играл с 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 голосов
/ 05 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...