У меня проблема с функциями C# GDI + draw string - я не могу получить точный размер моей нарисованной строки - без внутреннего ведущего и внешнего, только em em height. API-интерфейсы для шрифтов/строк, предоставленные Microsoft, по-видимому, всегда выводят ограничивающий прямоугольник, который на несколько пикселей больше, чем текст, даже после того, как я удалил внутреннюю строку.GDI +, Удалить пустое пространство из Graphics DrawString()
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.Clear(Color.Black);
String text = "The quick brown fox jumps over the lazy dog";
Font font = new System.Drawing.Font(FontFamily.GenericSerif, 24);
float internalLeading = font.Size * (font.FontFamily.GetCellAscent(font.Style) + font.FontFamily.GetCellDescent(font.Style) - font.FontFamily.GetEmHeight(font.Style))/font.FontFamily.GetEmHeight(font.Style);
StringFormat format = StringFormat.GenericTypographic;
format.Trimming = StringTrimming.None;
format.FormatFlags = StringFormatFlags.NoWrap;
System.Drawing.RectangleF rect = new System.Drawing.RectangleF(0, 0, pictureBox1.Width,pictureBox1.Height);
System.Drawing.CharacterRange[] ranges = { new System.Drawing.CharacterRange(0, text.Length) };
System.Drawing.Region[] boundings = new System.Drawing.Region[1];
format.SetMeasurableCharacterRanges(ranges);
boundings = g.MeasureCharacterRanges(text, font, rect, format);
rect = boundings[0].GetBounds(g);
g.DrawString(text, font, new SolidBrush(Color.Red), new RectangleF(0,0,rect.Width,rect.Height), format);
g.DrawRectangle(Pens.Yellow, rect.X, rect.Y + internalLeading, rect.Width, rect.Height - internalLeading);
}
И выход показан ниже. Мы можем видеть, что между текстом и верхним краем ограничивающей рамки все еще имеется несколько пикселей.
я могу получить точный размер нарисованной строки, читая пикселей в изображении и вычислить ограничивающий прямоугольник сам. Но это медленно. Могу ли я узнать, есть ли простой способ просто обойти это?
Как правило, я использую типографский параметр. Но чтобы получить пиксельный точный ограничивающий прямоугольник, я думаю, вам нужно использовать GraphicsPath и получить его границы. – TaW
Ahh, GraphicsPath, спасибо! Я попробую! – ncite