如何在两个不相邻的区域画线

时间:2018-08-20 10:26:15

标签: c# .net vb.net gdi+ gdi

我不知道GDI32中是否有任何方法可以在表单的两个不相邻区域(例如矩形)上绘制字符串?。

如示例图片所示,如果到达第一个矩形的边缘,则文本应自动分割。 感谢您的帮助。

enter image description here

1 个答案:

答案 0 :(得分:0)

使用两个Labels和一个TrackBar的示例。
TrackBar确定一个标签内的字符串位置,每当字符串移动时,该位置就会在第二个Label上反映出来。
这种级联效果是使用第二个Label的.Invalidate()方法生成的,该方法是从第一个Label Paint()事件调用的。

我只是在这里使用Graphics.MeasureString()Graphics.DrawString()
您也可以使用相关的TextRenderer方法,但是在Label中,度量是相同的。

结果的视觉表示:

Label Marquee

float stringLength = 0F;
string loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
StringFormat MarqueeFormat = new StringFormat(StringFormatFlags.NoWrap | StringFormatFlags.FitBlackBox)
{
    Alignment = StringAlignment.Near,
    Trimming = StringTrimming.None
};

private void lblMarquee1_Paint(object sender, PaintEventArgs e)
{
    SizeF stringSize = e.Graphics.MeasureString(loremIpsum, ((Control)sender).Font, -1, MarqueeFormat);
    PointF stringLocation = new PointF(trackBar1.Value, (((Control)sender).Height - stringSize.Height) / 2);
    stringLength = ((Control)sender).ClientRectangle.Width - stringLocation.X;

    e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
    e.Graphics.DrawString(loremIpsum, ((Control)sender).Font, Brushes.Black, stringLocation, MarqueeFormat);
    lblMarquee2.Invalidate();
}

private void lblMarquee2_Paint(object sender, PaintEventArgs e)
{
    SizeF stringSize = e.Graphics.MeasureString(loremIpsum, ((Control)sender).Font, -1, MarqueeFormat);
    PointF stringLocation = new PointF(-stringLength, (((Control)sender).Height - stringSize.Height) / 2);

    e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
    e.Graphics.DrawString(loremIpsum, ((Control)sender).Font, Brushes.Black, stringLocation, MarqueeFormat);
}

private void trackBar1_ValueChanged(object sender, EventArgs e)
{
    lblMarquee1.Invalidate();
}