Создайте прямоугольник для строки, размер которой можно изменять и располагать по центру

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

введите описание изображения здесь

Мне нужен результат:

введите описание изображения здесь

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


person TerribleDog    schedule 31.10.2018    source источник
comment
Некоторые изображения, показывающие, как вы ожидаете, будет выглядеть результат (в разных размерах), будут оценены.   -  person mjwills    schedule 05.11.2018
comment
Прежде всего следует отметить, что проверка isOutlined не дает другого результата. Это (int)_fontStyle.Style, который определяет Font.Style. Вы можете немного ОСУШИТЬ свой код. Чтобы растянуть строку, вам просто нужно добавить матрицу преобразования или использовать e.Graphics.TranslateTransform(scaleX, scaleY), где scaleX и scaleY задаются соотношением между текстовой мерой (Ширина, Высота) и прямоугольником контейнера (Ширина, Высота). Ничего больше. Graphics.DrawString() соответственно масштабирует / растягивает текст.   -  person Jimi    schedule 05.11.2018
comment
@Jimi функция для логического значения isOutlined находится в другой форме (событие радио-кнопки)   -  person TerribleDog    schedule 05.11.2018
comment
Я попробую @Jimi.   -  person TerribleDog    schedule 05.11.2018
comment
@Jimi Я думаю, мне действительно нужно создать прямоугольник для каждой буквы, маленькая буква сначала растягивается, если не набрана заглавная буква.   -  person TerribleDog    schedule 05.11.2018
comment
@Jimi при вводе точки [.] Растягивается до тех пор, пока не будет набран другой символ.   -  person TerribleDog    schedule 05.11.2018
comment
Он где тянется? Вы заранее измерили ширину текста? Вам нужно начать растягивать текст, когда он шире ограничивающего прямоугольника.   -  person Jimi    schedule 05.11.2018
comment
Он растягивает его по высоте. Он адаптируется к высоте прямоугольника, которая адаптируется к высоте строки.   -  person TerribleDog    schedule 05.11.2018
comment
То же самое относится и к высоте. Если высота текста меньше высоты прямоугольника, не растягивайте его (не применяйте преобразование).   -  person Jimi    schedule 05.11.2018
comment
Но высота прямоугольника зависит от роста персонажа.   -  person TerribleDog    schedule 05.11.2018
comment
Кроме того, в графическом поле отображается X, если в текстовом поле нет символов.   -  person TerribleDog    schedule 05.11.2018
comment
Может, здесь мы друг друга не понимаем. Если размер прямоугольника определяется размером текста, когда вы растягиваете текст? На этих условиях - никогда, поскольку текст определяет свои границы. Возможно, вы захотите более подробно объяснить ситуацию, добавив в вопрос подробностей о том, чего вы хотите достичь, и при каких условиях это все работает.   -  person Jimi    schedule 05.11.2018
comment
Мне очень жаль, если мы сейчас не на одной странице.   -  person TerribleDog    schedule 05.11.2018
comment
@Jimi Я обновил вопрос.   -  person TerribleDog    schedule 05.11.2018
comment
@Jimi Мне нужно масштабировать текст, нарисованный в окне изображения (Оба, Ширина и Высота), а также другие модификации, как видно в моем пользовательском интерфейсе.   -  person TerribleDog    schedule 05.11.2018
comment
Затем вам нужно начать с масштаба 0, который задается текстом. Размер с использованием определенного размера шрифта и веса. Это ваш ограничивающий прямоугольник. Когда вы применяете масштаб, вы применяете его к этому справочному прямоугольнику. Измерьте текст, масштабируйте его относительно ограничивающего прямоугольника, примените преобразование любым из возможных способов, затем нарисуйте текст в масштабируемом контексте устройства. Если вы измените шрифт, повторно измерьте текст, снова установите ограничивающий прямоугольник, затем повторно примените преобразование, нарисуйте текст. Он будет масштабироваться в соответствии с вашими настройками.   -  person Jimi    schedule 05.11.2018
comment
Это долгий путь, но я постараюсь это понять. @Jimi   -  person TerribleDog    schedule 05.11.2018
comment
@TerribleDog Итак, вы хотите сформировать прямоугольник, который можно перетаскивать для изменения размера.?   -  person SH7    schedule 08.11.2018


Ответы (1)


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

введите описание изображения здесь


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

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

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

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

person Jeremy Thompson    schedule 12.11.2018
comment
Не беспокойтесь, я использовал это в коммерческом решении - оно даже поставляется с Undo / Redo .. stackoverflow.com/questions/17182062/ - person Jeremy Thompson; 12.11.2018
comment
Проблема со статьей Рода Стивенса о смещении вращения, мне снова пришлось использовать WayBack Machine, чтобы увидеть ее: https://web.archive.org/web/20150302104614/http://csharphelper.com/blog/2015/02/interactively-rotate-images-by-an-random-angle-in-c/ - person Jeremy Thompson; 12.11.2018