Создайте прямоугольник для строки, размер которой можно изменить и расположить по центру - PullRequest
0 голосов
/ 31 октября 2018

Сначала я использовал 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 для справки:

enter image description here

Результат мне нужен:

enter image description here

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

1 Ответ

0 голосов
/ 12 ноября 2018

У меня была попытка, и я не мог понять отношения прямоугольников с буквами ...

enter image description here


Тем не менее, я предлагаю более элегантное, проверенное временем и математически правильное решение.

Алекс Фр представил превосходный набор инструментов для рисования в своей статье DrawTools , и этот проект служит основой для Инструмент рисования Redux .

Первоначальный проект Алекса Фра был основан на примере проекта Microsoft C ++ MFC, который разработчики могут извлечь из DRAWCLI. Программа DrawTools C # воспроизводит некоторые функциональные возможности DRAWCLI и использует некоторые конструктивные решения из этого примера. В наши дни это можно увидеть только через ссылку на систему WayBack: https://web.archive.org/web/20120814082327/https://www.codeproject.com/Articles/8494/DrawTools

Я бы порекомендовал вам поменять библиотеки чертежей и начать с действительно хорошо разработанного решения. Инструмент рисования Redux обладает большинством функциональных возможностей, которые, на мой взгляд, вам нужны. За исключением смещения вращения, которое, я полагаю, я видел в примере Рода Стивенса , здесь он снова находится на WayBack Machine: Интерактивное вращение изображений на произвольный угол в C # .

...