首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GraphicsPath消除文本边框

GraphicsPath消除文本边框
EN

Stack Overflow用户
提问于 2014-03-13 10:27:22
回答 1查看 594关注 0票数 1

我使用GraphicsPath对象在矩形中绘制文本。矩形比文本大,我想在矩形的任何角落,也在它的边缘中心绘制文本。

我遇到的问题是,当我绘制路径时,源矩形周围会留下一个边框。我希望能够消除该边框,并使文本触摸它的边界矩形。

下面是我的代码:

代码语言:javascript
复制
private void Form1_Paint(object sender, PaintEventArgs e)
{
    var g = e.Graphics;
    g.SmoothingMode = SmoothingMode.HighQuality;

    Rectangle textRect = new Rectangle(100, 100, 150, 150);
    Font f = new Font("Arial", 16);
    float emSize = f.Height * f.FontFamily.GetCellAscent(f.Style) /
               f.FontFamily.GetEmHeight(f.Style);

    foreach (StringAlignment lineAlignment in Enum.GetValues(typeof(StringAlignment)))
    {
        foreach (StringAlignment alignment in Enum.GetValues(typeof(StringAlignment)))
        {
            StringFormat sf = new StringFormat() { LineAlignment = lineAlignment, Alignment = alignment };
            using (GraphicsPath gp = new GraphicsPath())
            {
                gp.AddString("txt", f.FontFamily, (int)f.Style, emSize, textRect, sf);
                RectangleF bounds = gp.GetBounds();
                g.FillPath(Brushes.Black, gp);
                g.DrawRectangle(Pens.Red, Rectangle.Round(bounds));
            }
        }
    }          

    g.DrawRectangle(Pens.Blue, textRect);
}

其结果是:

基本上,我希望红色矩形(和它们包含的文本)触摸蓝色矩形,并消除它们之间的边框。另外,我需要使用GraphicsPath而不是DrawString

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-19 18:34:22

最后,我编写了一个帮助方法来计算矩形的偏移量,并在绘制它之前翻译文本。下面是我写的方法:

代码语言:javascript
复制
private PointF FixAlignment(RectangleF parentRect, RectangleF childRect,
    StringAlignment lineAlignment, StringAlignment alignment)
{
    float xOffset = 0;
    float yOffset = 0;

    switch (lineAlignment)
    {
        case StringAlignment.Near:
            yOffset = parentRect.Top - childRect.Top;
            break;
        case StringAlignment.Far:
            yOffset = parentRect.Bottom - childRect.Bottom;
            break;
    }

    switch (alignment)
    {
        case StringAlignment.Near:
            xOffset = parentRect.Left - childRect.Left;
            break;
        case StringAlignment.Far:
            xOffset = parentRect.Right - childRect.Right;
            break;
    }

    return new PointF(xOffset, yOffset);
}

我在Form1_Paint方法中使用它,如下所示:

代码语言:javascript
复制
private void Form1_Paint(object sender, PaintEventArgs e)
{
    var g = e.Graphics;
    g.SmoothingMode = SmoothingMode.HighQuality;

    Rectangle textRect = new Rectangle(100, 100, 150, 150);
    Font f = new Font("Arial", 16);
    float emSize = f.Height * f.FontFamily.GetCellAscent(f.Style) /
               f.FontFamily.GetEmHeight(f.Style);

    foreach (StringAlignment lineAlignment in Enum.GetValues(typeof(StringAlignment)))
    {
        foreach (StringAlignment alignment in Enum.GetValues(typeof(StringAlignment)))
        {
            StringFormat sf = new StringFormat() { LineAlignment = lineAlignment, Alignment = alignment };
            using (GraphicsPath gp = new GraphicsPath())
            {
                gp.AddString("txt", f.FontFamily, (int)f.Style, emSize, textRect, sf);
                RectangleF bounds = gp.GetBounds();

                // Calculate the rectangle offset
                PointF offset = FixAlignment(textRect, bounds, lineAlignment, alignment);
                // Translate using the offset
                g.TranslateTransform(offset.X, offset.Y);
                g.FillPath(Brushes.Black, gp);
                g.DrawRectangle(Pens.Red, Rectangle.Round(bounds));

                // Translate back to the original location
                g.TranslateTransform(-offset.X, -offset.Y);
            }
        }
    }

    g.DrawRectangle(Pens.Blue, textRect);
}

结果如下:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22375646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档