Сначала я использовал drawString и GraphicsPath.AddString, чтобы нарисовать контурный / сплошной текст в PictureBox. Я могу изменить размер шрифта, стиль и семейство шрифтов, но я понял, что не смогу изменять размер / растягивать текст, поскольку размер шрифта пропорционально распределяется по строке. Итак, решение, которое мне сказали, было следующим:
Мне сообщили, что для масштабирования текста (из строки рисования) мне нужно использовать прямоугольник, от которого будет зависеть текст. Таким образом, я могу изменить размер всего текста (ширину, высоту и т. Д.). Но я не знаю, как это сделать.
PS. Если есть другие способы, подскажите. Спасибо всем.
Вот мой метод TextDrawing:
public void DrawRects(Font f, string text, Graphics g, RectangleF rect)
{
List<RectangleF> list = new List<RectangleF>();
using (StringFormat format = new StringFormat())
{
int i;
format.Alignment = StringAlignment.Near;
format.LineAlignment = StringAlignment.Center;
format.Trimming = StringTrimming.None;
format.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;
CharacterRange[] ranges = new CharacterRange[text.Length];
for (i = 0; i < text.Length; i++)
{
ranges[i] = new CharacterRange(i, 1);
}
format.SetMeasurableCharacterRanges(ranges);
Region[] regionArray = g.MeasureCharacterRanges(text, f, rect, format);
for (i = 0; i < regionArray.Length; i++)
{
list.Add(regionArray[i].GetBounds(g));
}
foreach (RectangleF r in list)
{
//g.SmoothingMode = SmoothingMode.AntiAlias;
//g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
//g.InterpolationMode = InterpolationMode.High;
g.DrawRectangle(Pens.LightBlue, Rectangle.Round(r));
}
using (GraphicsPath path = new GraphicsPath())
{
path.AddString(text, f.FontFamily, Convert.ToInt32(f.Style), g.DpiY * rect.Height/72f, rect.Location, format);
RectangleF text_rectf = path.GetBounds();
PointF[] target_pts = {
new PointF(rect.Left, rect.Top),
new PointF(rect.Right, rect.Top),
new PointF(rect.Left, rect.Bottom)};
g.Transform = new Matrix(text_rectf, target_pts);
g.FillPath(Brushes.Red, path);
g.DrawPath(Pens.Red, path);
g.ResetTransform();
}
//g.SmoothingMode = SmoothingMode.AntiAlias;
//g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
//g.InterpolationMode = InterpolationMode.High;
//g.DrawString(text, f, Brushes.Red, rect, format);
}
}
И мой UI для справки:
Мне нужен результат:
Изменить: я изменил код на моем текстовом рисунке, но я все еще не могу создать разные прямоугольники на каждой букве, размер которых можно изменять с помощью трекбара.
isOutlined
не дает другого результата. Это(int)_fontStyle.Style
, который определяет Font.Style. Вы можете немного ОСУШИТЬ свой код. Чтобы растянуть строку, вам просто нужно добавить матрицу преобразования или использоватьe.Graphics.TranslateTransform(scaleX, scaleY)
, гдеscaleX
иscaleY
задаются соотношением между текстовой мерой (Ширина, Высота) и прямоугольником контейнера (Ширина, Высота). Ничего больше.Graphics.DrawString()
соответственно масштабирует / растягивает текст. - person Jimi   schedule 05.11.2018