C # Graphics.DrawString RectangleF Авто-высота: как найти эту высоту? - PullRequest
6 голосов
/ 19 июля 2011

Я пишу текст поверх изображения, используя метод Graphics DrawString, привязывая мой текст к RectangleF. Вот мой код:

//Write header2
RectangleF header2Rect = new RectangleF();
header2Rect.Width = 600;
header2Rect.Location = new Point(30, 105);
graphicImage.DrawString(header2, new Font("Gotham Medium", 28, FontStyle.Bold),brush, header2Rect);
//Write Description
RectangleF descrRect = new RectangleF();
descrRect.Width = 600;
int measurement = ((int)graphicImage.MeasureString(header2, new Font("Gotham Medium", 28, FontStyle.Bold)).Height);
var yindex = int.Parse(105 + header2Rect.Height.ToString());
descrRect.Location = new Point(30, 105+measurement);
graphicImage.DrawString(description.ToLower(), new Font("Gotham", 24, FontStyle.Italic), SystemBrushes.WindowText, descrRect);

Это работает в некоторых случаях (т. Е. Когда header2 имеет длину только одну строку), но моя переменная measurement измеряет только высоту шрифта, а не весь прямоугольник DrawString. Я не хочу устанавливать статическую высоту header2Rect, потому что высота меняется в зависимости от текста.

yindex не работает, потому что header2Rect.Height = 0. Есть ли способ узнать, сколько строк у меня header2?

Мне просто нужно сделать ширину MeasureString и разделить ее на ширину моего прямоугольника границы, а затем умножить на высоту MeasureString? Я предполагаю, что есть лучший способ.

Спасибо

[EDIT] Похоже, высота на самом деле равна 0, но текст просто переполняется снаружи, но ширина по-прежнему ограничивает перенос текста. Я только что сделал некоторые математические вычисления, чтобы найти высоту, но я хотел бы, чтобы был лучший способ.

1 Ответ

10 голосов
/ 23 июля 2011

Вы никогда не устанавливаете высоту прямоугольника:

private void panel1_Paint(object sender, PaintEventArgs e)
{
  string header2 = "This is a much, much longer Header";
  string description = "This is a description of the header.";

  RectangleF header2Rect = new RectangleF();
  using (Font useFont = new Font("Gotham Medium", 28, FontStyle.Bold))
  {
    header2Rect.Location = new Point(30, 105);
    header2Rect.Size = new Size(600, ((int)e.Graphics.MeasureString(header2, useFont, 600, StringFormat.GenericTypographic).Height));
    e.Graphics.DrawString(header2, useFont, Brushes.Black, header2Rect);
  }

  RectangleF descrRect = new RectangleF();
  using (Font useFont = new Font("Gotham Medium", 28, FontStyle.Italic))
  {
    descrRect.Location = new Point(30, (int)header2Rect.Bottom);
    descrRect.Size = new Size(600, ((int)e.Graphics.MeasureString(description, useFont, 600, StringFormat.GenericTypographic).Height));
    e.Graphics.DrawString(description.ToLower(), useFont, SystemBrushes.WindowText, descrRect);
  }

}
...