【问题标题】:Position Of String Using StringFormat使用 StringFormat 的字符串位置
【发布时间】:2014-10-02 04:21:42
【问题描述】:

有没有办法在控件中获取绘制字符串的位置?我正在编写一个充当 GroupBox 的控件,当我绘制充当标题的字符串时,边框线穿过它。

为了解决这个问题,我只是要用背景色填充标题所在的矩形,这样标题就不会被划掉。我的问题是标题的位置由我通过 Graphics.DrawString() 方法传递的 StringFormat 决定。我不必显式声明字符串的位置,但我必须显式声明矩形的位置,我不知道字符串的位置在哪里。

我该怎么办?

【问题讨论】:

    标签: c# controls string-formatting


    【解决方案1】:

    相信你可以使用MeasureCharacterRanges准确测量琴弦位置

    这里有一个小例子:

    测量方法:

    public static RectangleF MeasureStringBounds(Graphics graphics, string text, Font  font,RectangleF bounding, StringFormat format)
    {
        var ranges =new[] {new CharacterRange(0, text.Length)};
    
        format.SetMeasurableCharacterRanges(ranges);
    
        var regions = graphics.MeasureCharacterRanges(text, font, bounding, format);
        var accurateBoundings = regions[0].GetBounds(graphics);
    
        return accurateBoundings;
    }
    

    用法:

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
    
        var str = "hello";
        var format = new StringFormat {Alignment = StringAlignment.Center};
    
        e.Graphics.DrawString(str, Font, new SolidBrush(Color.Black), new Rectangle(0, 0, Width, Height), format);
    
        //measuring part
        var region = MeasureStringBounds(e.Graphics, str, Font, new RectangleF(0, 0, Width, Height), format);
        //Draw measured region
        e.Graphics.DrawRectangle(new Pen(Color.Red), region.X, region.Y, region.Width, region.Height);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 2011-06-30
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      相关资源
      最近更新 更多