使用自动换行垂直滚动文本

Scroll text vertically with word wrap

我有一些可变长度的文本,必要时我想垂直滚动。可以在这里看到一个例子:https://social.msdn.microsoft.com/Forums/vstudio/en-US/77be2b96-b4b4-462c-b6d0-66c2c9739420/scroll-text-vertically 此示例中的解决方案的问题在于它不会自动换行文本。我还看到过在矩形内绘制文本然后移动矩形以产生滚动文本效果的示例,但我认为这对我不起作用。我在要滚动文本的位置上方和下方都有控件,并且文本高度高于屏幕高度。

我当前的 OnPaintEvent:

private void JvsMessageLabelPaint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawString(this.mLabelToScrollVertically.Text,
        this.mLabelToScrollVertically.Font, new SolidBrush(Color.Black), 
        this.mLabelToScrollVertically.Location.X, yPositionForLabel);
    yPositionForLabel -= 5;
    if (yPositionForLabel < this.mLabelToScrollVertically.Location.Y)
    {
        yPositionForLabel = this.mLabelToScrollVertically.Height;
    }
}
  • 不确定您是否可以使用它,但这是使用 ScrollBars 创建控件的常见解决方法:

Panel 放在 另一个 Panel 内。把外面的Panel改成AutoScroll=true,把里面的Height改成你测量过的文字..

这是 Paint 事件和结果:

private void pan_text_Paint(object sender, PaintEventArgs e)
{
   string text = yourLongText;

   SizeF size = e.Graphics.MeasureString(text, Font, pan_text.ClientSize.Width);

   pan_text.Height = (int) size.Height;

   e.Graphics.DrawString(text, Font, Brushes.Black, new RectangleF(PointF.Empty, size) );

}
  • 如果您想要滚动 动画 而不是 ScrollBars 用户,则同样的技巧将起作用。

只需不要制作外Panel AutoScroll并添加一个Timer:

private void StartButton_Click(object sender, EventArgs e)
{
    timer1 = new Timer();
    timer1.Interval = 15;
    timer1.Tick += timer1_Tick;
    timer1.Start();
}

void timer1_Tick2object sender, EventArgs e)
{
    pan_image.Top -= 2;
    if (pan_image.Top < -pan_image.Height) pan_image.Top = 0;
}
  • 事实上,对于简单的动画,您根本不需要外部 Panel

只需定义一个 class 变量来保存要绘制文本的当前位置并使用此 Tick 事件:

int curTop = 0;

void timer1_Tick(object sender, EventArgs e)
{
    curTop -= 2;
    if (curTop < -pan_image.Height) curTop = 0;
    pan_image.Invalidate();
}

现在如果你在DrawString中使用它,同样的效果会显示:

e.Graphics.DrawString(text, Font, Brushes.Black, 
                      new RectangleF(new PointF(0, curTop), size) );

(当然,由于 Panel 不再包含在外层中,因此您无需更改其 Height!)