为可调整大小和居中位置的字符串创建矩形

时间:2018-10-31 05:18:40

标签: c# winforms rectangles drawstring

首先,我使用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 :(得分:1)

我去了,我无法计算出与字母的矩形关系...

enter image description here


尽管如此,我还是提出了一个更优雅,经过时间考验和数学上正确的解决方案。

Alex Fr在其 DrawTools文章中提供了一套出色的绘图工具,该项目是Draw Tool 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具有我认为您需要的大多数功能。除了我认为我见过example of in Rod Stephens book的“旋转偏移量”,这里还是在WayBack Machine上:Interactively rotate images by an arbitrary angle in C#