2015-12-10 2 views
0

Я пытаюсь нарисовать коробку вокруг метки, которая была выровнена, например, с помощью StringAlignment.Far. Я могу найти Size текста, используя g.MeasureString, но я не могу найти способ перевода точки начала так, чтобы найти Rectangle, который ограничивает текст.Поиск ограничивающего прямоугольника текста с выравниванием

Скажем, у меня есть Point origin, на котором можно нарисовать, и StringFormat format с каким выравниванием я хочу, чтобы моя строка была. Я могу найти Size строки, используя g.MeasureString(text, font). Как перевести эту пару Point/Size в прямоугольник, который перекрывает вызов g.DrawString(text, font, brush, origin, format).

+0

Я только что нашел https://msdn.microsoft.com/en-us/library/windows/desktop/ms535831(v=vs.85).aspx, но я не могу понять, как использовать его в C# – fbstj

+0

У вас размер строки. Точно, где вы его положили, это зависит от вас. –

+0

Я знаю, но учитывая, что функции берут точку для рисования на, а затем параметры относительно того, где выровнять ее с этой точкой, как я могу найти, где положить размер, связанный с точкой? – fbstj

ответ

1

Трудно преобразовать c в управляемый код. Вы должны использовать код .Net напрямую, если он доступен.

Для MeasureString см ссылку Graphics.MeasureString Method

Пример:

using System.Diagnostics; 
... 
protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    Graphics g = e.Graphics; 
    Font font = new Font("Arial", 16); 
    SizeF sz = g.MeasureString("Text...", font); 

    Rectangle rc = new Rectangle(0,0, (int)sz.Width, (int)sz.Height); 
    Debug.WriteLine(rc.Width.ToString()); 
    Debug.WriteLine(rc.Height.ToString()); 

    //change top/left origin of rectangle 
    rc.X = 10; 
    rc.Y = 20; 
} 

Вам просто нужно ширину и высоту текста. Вы можете изменить левый/верхний угол rectangle.

Кстати, метод C дает прямоугольник с верхними/влево координат в нуле, так что это та же информация, как Size


Редактировать

Это будет соответствовать текст с слово- флаг разрыва в прямоугольник, ширина которого равна 100. Высота прямоугольника неизвестна. TextRenderer.MeasureText расскажет нам о высоте прямоугольника. Верхний/левый угол можно изменить, выравнивание можно изменить.

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    Font font = new Font("Arial", 10); 

    string text = "I'm trying to draw a box around a label which has been aligned."; 
    Size layout = new Size(100, 0); 

    Size sz = TextRenderer.MeasureText(e.Graphics, text, font, layout, 
      TextFormatFlags.WordBreak); 
    Rectangle rc = new Rectangle(new Point(0,0), sz); 

    e.Graphics.DrawRectangle(Pens.Black, rc); 
    TextRenderer.DrawText(e.Graphics, text, font, rc, 
     SystemColors.ControlText, SystemColors.Control, TextFormatFlags.WordBreak); 
} 
+0

Да, я использовал 'g.MeasureString', который принимает значение 'StringAlignment' (так как я хочу выровнять свой текст при его рисовании), но учитывая, что эти только возвращаемые размеры, как я могу найти начало после выравнивания? – fbstj

+0

Вы спрашиваете, как конвертировать 'Point' +' Size' в 'Rectangle', я объяснил это, и, видимо, вы уже это знаете. Это несколько строк, которые вы рисуете? Это, например, похоже на форматирование комментариев на этой веб-странице? Какие координаты вы предоставляете, и какие координаты вы хотите получить? –

+0

Я прошу преобразовать 'Point',' Size' и 'StringAlignment' в прямоугольник. или, по крайней мере, перевести «Точку» в верхний левый угол результирующего прямоугольника? – fbstj

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