在线上绘制字符串的中心位置

3
我需要在使用 Graphics.DrawLine 画出的线段中央绘制一些文本(数字),就像这样:。 1和2是按钮。我通过使用这里提供的答案来实现这一点。这种解决方案的问题在于它没有考虑到线条起点可能垂直低于终点(在这种情况下,文本会与线条重叠,并在某个时刻消失,如下图: 。 我知道如何解决线条起点垂直较低的主要问题,但如何使其不与线条重叠,如下图所示?: enter image description here

你需要向我们展示你代码的相关部分。 - Kempeth
1
创建一个函数,返回2个点之间的中心点。然后测量文本边界矩形,并在中点偏移边界大小处绘制! - TaW
1
如果您使用RotateTransform + TranslateTransform来绘制该线,则在正确位置绘制该字符串会更加轻松。 - Hans Passant
@HansPassant 谢谢,我会尝试这种方法。在我使用RotateTransform + TranslateTransform对线进行操作后,如何旋转文本? - Asad Ali
重点是你不必这样做,旋转变换仍然有效。 - Hans Passant
1个回答

1

根据评论更新。

我认为你需要的是以下内容(请注意,我使用了测试数据,需要进行一些调整。这将采用您的2个点,创建一个中位数,测量您的字符串,偏移中位数,并绘制该字符串。

 private void Form1_Paint(object sender, PaintEventArgs e)
 {
     var pt1 = new Point(25, 25);
    var pt2 = new Point(100, 10);
    var ptMed = new Point((pt1.X + pt2.X) / 2, (pt1.Y + pt2.Y) / 2);
    var g = e.Graphics;
    var lbl = "1";
    var offset = g.MeasureString(lbl, this.Font);
    ptMed.Y -= (int)offset.Height;
    ptMed.X -= (int)offset.Width;
    var p = new Pen(Brushes.White);
    g.DrawLine(p, pt1, pt2);
    g.DrawString(lbl, this.Font, Brushes.White, ptMed);
 }

enter image description here


最重要的工作是插入“using”块,以防止所有这些资源泄漏!此外,永远不要使用“CreateGraphics”。在“Paint”事件处理程序中完成所有绘图。 - Cody Gray
你的偏移量只应用于Y轴,因此在不同的斜率标签将重叠。 - gabba
MeasureString 返回一个 Size,因此您只需要调用它一次。如果您正在使用 Brushes.White,那么您也可以使用 Pens.White。 - TaW
如何将文本旋转以匹配线的角度? - Asad Ali
随着角度越来越极端,文本位置变得不合适。 - user117499

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接