【问题标题】:How to center text on specific character position?如何在特定字符位置居中文本?
【发布时间】:2017-05-03 21:20:09
【问题描述】:

我有一个带有文本的字符串,我想以特定字符位置为中心输出它。

有没有办法使用例如标签来做到这一点?

或者我应该更好地考虑使用 GDI+ 绘制一个字符串,测量每个字符的长度,然后在我需要的地方手动绘制它,居中?

例如,为了更清楚:

字符串:“Lorem Ipsum”,位置:2。

因此,我需要以这样的方式显示字符串,即字符“r”将位于任何显示框(标签等)的中间。

【问题讨论】:

  • 您可以结合 GDI+(印刷)测量这两个部分来找到相对宽度。然后相应地定位标签..
  • @TaW,是的,我在提到 GDI+ 的时候也在考虑这个问题,但我对 GDI+ 不太擅长,想知道是否有更简单的解决方案。
  • 如果你想像这样任意对齐,没有比手动绘制更简单的解决方案了。当然,这也需要您对其进行测量。如果它是Label 控件,它实际上是用 GDI 绘制的,而不是 GDI+,你应该坚持下去。 TextRenderer.DrawText 用于输出,TextRenderer.MeasureText 用于测量。
  • @CodyGray,谢谢,看来我得这么做了。

标签: c# winforms text


【解决方案1】:

这是一个定位函数,应该会有所帮助:

void positionTo(Label lbl, Panel pan, int pos)
{
    SizeF sz0, sz1, sz2;
    sz0 = sz1 = sz2 = Size.Empty;
    using (Graphics g = lbl.CreateGraphics())
    {
        StringFormat sf = StringFormat.GenericTypographic;
        sz0 = g.MeasureString(lbl.Text, lbl.Font, pan.Width, sf);
        sz1 = g.MeasureString(lbl.Text.Substring(0, pos), lbl.Font, pan.Width, sf);
        sz2 = g.MeasureString(lbl.Text.Substring(pos), lbl.Font, pan.Width, sf);
    }
    lbl.Left = (int)(pan.Width / 2 - sz1.Width);
}

请注意,我只使用左侧部分测量。可以同时使用两者来细化居中..

【讨论】:

  • 谢谢,我明白了。
  • @TaW 你能给这个简单示例的链接吗?
  • 什么意思??这是numericUpDown1_ValueChanged 事件代码:positionTo(label2, panel1, (int)numericUpDown1.Value);
  • 如果您让标签绘制自己的文本,这会给您错误的结果。与所有控件一样,标签使用 GDI 呈现来绘制其文本,原因有很多。简而言之,它比 GDI+ 更好、更清晰、更快。 Graphics.MeasureString/DrawString 都是 GDI+。你想要匹配的是TextRenderer.MeasureText/DrawText。即使您也在自定义绘制文本,您也应该使用TextRenderer.DrawText,因为它更好、更清晰、更快。 :-) 这是一个常见的混淆点,所以我只是想澄清我之前的评论。
  • 我在我的示例中不使用所有者绘图,也不建议这样做。 - 由于TextRenderer.MeasureText 没有像GenericTypographic 这样的选项,它总是带有太大的尺寸,当我们想要连接我们绘制的字符串时可以,但不是在这里。它可能在使用左右大小并计算百分比以与实际 Label.Width 一起使用时起作用,Label 具有 AutoSize on..
猜你喜欢
  • 2014-06-28
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多